Skip to content

EdYuTo/MoviesSampleApp

Repository files navigation

MoviesSampleApp

TODO list

  • Ci/cd
  • Core networking
  • Core caching
  • Movie listing
  • Movie searching
  • Movie details
  • Favoriting / saving movies
  • Better ui / animations
  • Add observability / logging lib
  • Migrate to combine
  • Migrate to SwiftTesting
  • Add cache expiry logic
  • Use api search instead of local search
  • Modules for each core dependency
  • Modules with custom tests and actions

Dependencies

This projects uses Xcodegen, Fastlane and Bundler to minimize your time setting up everything! It also has Swiftlint to ensure code coding style and conventions.

Please use Xcode 16 to run this.

Why those?

Xcodegen is a good choice when wroking in big repos because it removes the need for pushing .xcodeproj and .xcworkspace to remote. This is possible thanks to the way it works, we provide a configuration file (project.yml) that is used to generate .xcodeproj files on the fly! There are other alternatives too, one that work particulary well with SPM is called Tuist

Fastlane is just awesome, it's a really powerful tool that allow creating lanes for each job your pipeline might need. If you see my other test repo you'll see that i did basically the same github actions configurations as here, but using Makefile. You'll also see that it was necessary a couple of extra scripts to achieve what was possible with just one file with Fastlane.

Bundler was used to ensure all machines run under the same dependencies. It's super annoying when the code works on my machine, but you can't get it to run on someone else's. In theory, if we all run with the same conditions, the project should work just fine for everybody!

In the same line as Bundler, other awesome tools that we could use are Xcodes for managing xcode versions and rbenv to manage different ruby versions (specially for our fastlane gems!).

Swiftlint is used to ensure a codebase consistency and clarity.

Setup

Although this is not required, it is recommended to use rbenv to manage your ruby environment:

brew install rbenv
rbenv install 3.2.0
rbenv local 3.2.0

First install any missing dependencies with:

bundle install

Then run fastlane to create the project:

bundle exec fastlane generate_project

Architecture

You can find the design document for the app in Miro here.

Screens

But overall we're aiming for 3 screens:

  • One for listing the movies
  • One for showing the details for that movie
  • One for listing saved / favorited movies

Components

You'll notice that I'm structuring this project using VIP pattern. And, to be honest, this was more of a personal choice for the stack that we'll be using here. If we were to use SwiftUI and/or reactive programming, I'd definetely go for a MVVM pattern, since I belive it works pretty well with reactivity.

Excluding ui components, here is how this project will be sctructured:

Resource providers

Movie list

Movie details

Favorite list


As a side note, this design document was created before the actual implementation of the app (as it should be haha). So if there are any differences between both, something might had happened and it would be a good point for discussions on why the change.

About the api

This project uses TMDB's api.

Here are a couple of references:

About icon

Icon downloaded from: https://www.iconfinder.com/iconsets/user-interface-777

About

Just a sample

Resources

License

Stars

Watchers

Forks