{"id":21946185,"url":"https://github.com/grdsdev/tvmazeapp","last_synced_at":"2025-07-22T05:31:26.757Z","repository":{"id":123154984,"uuid":"360952453","full_name":"grdsdev/tvmazeapp","owner":"grdsdev","description":null,"archived":true,"fork":false,"pushed_at":"2021-07-20T10:19:48.000Z","size":259,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-22T16:39:15.551Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grdsdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-04-23T17:00:58.000Z","updated_at":"2024-02-03T13:49:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"4b10eb06-5782-4995-962f-b60957e9b884","html_url":"https://github.com/grdsdev/tvmazeapp","commit_stats":null,"previous_names":["grdsdev/tvmazeapp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/grdsdev/tvmazeapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grdsdev%2Ftvmazeapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grdsdev%2Ftvmazeapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grdsdev%2Ftvmazeapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grdsdev%2Ftvmazeapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grdsdev","download_url":"https://codeload.github.com/grdsdev/tvmazeapp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grdsdev%2Ftvmazeapp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266433114,"owners_count":23927704,"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","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-11-29T04:29:27.279Z","updated_at":"2025-07-22T05:31:26.437Z","avatar_url":"https://github.com/grdsdev.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TvMaze App\n\nThis is an app built as a coding challenge, it was built with simplicity in mind and to showcase some of my knowledges.\n\n\n## Getting started \n\nTo run it locally just clone the repository and open the `TvMazeApp.xcworkspace` in `Xcode`.\n\nThe project was built using Xcode 12.4, older versions may not work.\n\n```bash \n  git clone https://github.com/grsouza/tvmazeapp\n  cd tvmazeapp\n  open -a Xcode TvMazeApp.xcworkspace\n```\n\nThe project uses [SPM](https://swift.org/package-manager/) for package management, so there is no need for installing an external tool like `Cocoapods` or `Carthage`.\n    \n\n## Documentation\n\nThe root directory contains:\n\n* `App`: The main application target, contains only the AppDelegate and has the single purpose of bootstraping the application.\n* `Makefile`: A simple Makefile to automate some tasks, like running tests and formatting code.\n* `README.md`: The file you are reading now.\n* `TvMazeApp.xcworkspace`: The Xcode's workspace that should be opened on Xcode, it contains the main project and SPM package.\n* `TvMazeAppLib`: This is the main SPM package, where all the important code resides.\n\n```\n.\n├── App\n├── Makefile\n├── README.md\n├── TvMazeApp.xcworkspace\n└── TvMazeAppLib\n```\n\nThe project structure is very simple, it consists of a main application target that contains only the `AppDelegate` and has the purpose of starting up the application and forward to the `AppCoordinator` class.\n\n### The SPM modules\n\nIf you take a look at `./TvMazeAppLib/Package.swift` you will see the definition of all submodules that forms the application, here is an overview of each of them.\n\n* `ApiClient`: contains all the code related to the communication with the `TvMaze` REST api.\n* `AppEnvironment`: contains a definition of all the application environment and it's dependencies, heavly inspired on this talk from the guys at pointfree (https://www.pointfree.co/blog/posts/21-how-to-control-the-world).\n* `AppFeature`: contains the entry point of the application, it's the module that the `AppDelegate` calls once the app has started.\n* `EpisodesFeature`: contains screens and logic related to the episodes list and details.\n* `Helpers`: some helpers and common codes to all modules.\n* `L10n`: consists of the string resources used thoughout the applications, the app is not localized, but it's a supported feature since day 1.\n* `Models`: contains some domain modules used by the features modules.\n* `ShowFeature`: contains screens and logic related to the shows list and details.\n* `TestSupport`: contains some test related helpers, used by the unit test targets, basically consists of a mock implementaion of the `AppEnvironment`.\n\n\n```\n.\n├── ApiClient\n├── AppEnvironment\n├── AppFeature\n├── EpisodesFeature\n├── Helpers\n├── L10n\n├── Models\n├── ShowFeature\n└── TestSupport\n```\n\n### Architectural decisions\n\nThe application is built using `MVVM + Coordinator` and using `Combine` for communication between the layers.\n\n\n### Continuous Integration\n\nI've setup a CI system using Github Actions, but unfortunatly I exceeded my monthly quota, so the last pipelines are failing. The CI workflow can be found at `.github/workflows/test.yml`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrdsdev%2Ftvmazeapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrdsdev%2Ftvmazeapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrdsdev%2Ftvmazeapp/lists"}