{"id":7548411,"url":"https://github.com/rcaos/TVToday","last_synced_at":"2025-05-12T01:31:34.998Z","repository":{"id":37830788,"uuid":"212464712","full_name":"rcaos/TVToday","owner":"rcaos","description":"iOS TV Shows app with TMDb Api. Combine, MVVM + Coordinator. Modular Architecture. Swift Package Manager","archived":false,"fork":false,"pushed_at":"2024-10-30T21:29:04.000Z","size":70194,"stargazers_count":169,"open_issues_count":1,"forks_count":31,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-30T22:23:31.436Z","etag":null,"topics":["clean-architecture","combine","combine-framework","coordinator","coordinator-pattern","dependency-injection","ios","ios-app","modular-architecture","mvvm","spm","swift","swift-package-manager","swift5","themoviedb","themoviedb-api","tmdb","tmdb-api"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rcaos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-03T00:00:28.000Z","updated_at":"2024-10-22T15:42:22.000Z","dependencies_parsed_at":"2024-10-23T13:43:46.591Z","dependency_job_id":null,"html_url":"https://github.com/rcaos/TVToday","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcaos%2FTVToday","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcaos%2FTVToday/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcaos%2FTVToday/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcaos%2FTVToday/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rcaos","download_url":"https://codeload.github.com/rcaos/TVToday/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225112922,"owners_count":17422827,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","combine","combine-framework","coordinator","coordinator-pattern","dependency-injection","ios","ios-app","modular-architecture","mvvm","spm","swift","swift-package-manager","swift5","themoviedb","themoviedb-api","tmdb","tmdb-api"],"created_at":"2024-04-08T00:53:33.762Z","updated_at":"2024-11-18T01:31:09.443Z","avatar_url":"https://github.com/rcaos.png","language":"Swift","funding_links":[],"categories":["Media"],"sub_categories":["Content"],"readme":"[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n![Platforms](https://img.shields.io/badge/platform-iOS-lightgrey.svg)\n[![Swift Version](https://img.shields.io/badge/Swift-5-F16D39.svg?style=flat)](https://developer.apple.com/swift)\n[![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager)\n\nTVShows iOS app using the [TMDb API](https://www.themoviedb.org/).\n\n## What I'm working on\n\n- ✅ Migrate Networking layer from Combine to Async await \n- ✅ Localize UI and requests to endpoint\n- ✅ Support Dynamic Type \n\n\n- ✅ Improve UseCases and Repositories use (Clear separation between Repositories and DataSources\n\n- ✅ Moving from Realm to Core Data\n\n- ✅ Add demo apps for feature modules.\n\n- ✅ Fix testability on Schedulers\n\n- ✅ Migrate from RxDataSources to UICollectionViewDiffableDataSource\n- ✅ Migrate from RxSwift to Combine\n\n \n## About modularization\n\nIn this project, I show you an approach to how you could structure your app. \n\nIn a real big app, you will have more and big dependencies.\n\nDuring development time, compiling the whole app could take quite an amount of time.\n\nCurrently, the app is divided into 22 modules with 06 feature modules. [See](https://github.com/rcaos/TVToday/blob/master/Package.swift)\n\nEach feature module has its own demo target with a custom demo entry point.\n\nSo you need to leverage your Unit tests, Snapshot Tests and Demo targets to save your time and boost your productivity.\n\n\n## Built with\n- Swift 5\n- Async-await\n- Clean + Modular Architecture\n- Coordinator Pattern.\n- MVVM\n- Dependency Injection\n- Kingfisher\n- Core Data\n- KeychainSwift\n- Swift Package Manager\n- Dark Mode support\n- Dynamic Type support\n- English and Spanish Localized\n\n## Requirements\n1. Xcode 15.0+\n\n## Getting started\n1. Clone this repository.\n2. Open `App/TVToday.xcodeproj` and have fun.\n\n## Testing\n- I use plain tests and Snapshot tests\n- Check the test Plan associated to the AppFeature to run all the availabe tests\n\n## Snapshot Tests\nLast snapshot tests were created using an Apple Silicon with `Xcode 15.0`, Simulator `iPhone SE (3rd generation) iOS 17.0 (21A328)`\n\u003e ⚠️ Warning: Snapshots must be compared using the exact same simulator that originally took the reference to avoid discrepancies between images.\n\n\n## Project evolution\n- Monolith: https://github.com/rcaos/TVToday/releases/tag/v0.3.0\n- RxSwift + CocoaPods : https://github.com/rcaos/TVToday/releases/tag/v.0.4.0\n- RxSwift + SPM + Tuist: https://github.com/rcaos/TVToday/releases/tag/v0.5.0\n- Combine + SPM + Tuist https://github.com/rcaos/TVToday/releases/tag/v0.6.0\n- Combine + SPM https://github.com/rcaos/TVToday/releases/tag/v.0.7.0\n- Current branch: Async-await + SPM\n\n## Screenshots\n\n### Dynamic Type\n\u003cp\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dynamic-type-1.png\" width=\"600\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dynamic-type-2.png\" width=\"600\"\u003e\n\u003c/p\u003e\n\n## Dark Mode\n\u003cp\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/01.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/02.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/03.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/04.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/05.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/06.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/07.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/dark/08.png\" width=\"215\" height=\"383\"\u003e\n\u003c/p\u003e\n\n## Light Mode\n\u003cp\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/01.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/02.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/03.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/04.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/05.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/06.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/07.png\" width=\"215\" height=\"383\"\u003e\n\u003cimg src=\"https://github.com/rcaos/TVToday/blob/master/Screenshots/light/08.png\" width=\"215\" height=\"383\"\u003e\n\u003c/p\u003e\n\n# Author\nJeans Ruiz, jeansruiz.c@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcaos%2FTVToday","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frcaos%2FTVToday","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcaos%2FTVToday/lists"}