├── .github
└── pull_request_template.md
├── .gitignore
├── LICENSE
├── README.md
├── bin
└── install_tooling.sh
├── screenshots
├── screenshot-1.png
├── screenshot-2.png
├── screenshot-3.png
└── screenshot-4.png
└── solutions
├── devpsrint-michael-douglas-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── Buttons
│ │ │ │ └── ButtonView
│ │ │ │ │ ├── ButtonView.swift
│ │ │ │ │ └── ButtonViewConfiguration.swift
│ │ │ ├── LoadingView
│ │ │ │ ├── LoadingView.swift
│ │ │ │ └── LoadingViewConfiguration.swift
│ │ │ └── Views
│ │ │ │ └── EmptyView
│ │ │ │ ├── EmptyView.swift
│ │ │ │ └── EmptyViewConfiguration.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── Cells
│ │ │ │ └── RepositoryCellView.swift
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ ├── GitHubAppTests.swift
│ └── SnapshotTests
│ │ ├── LoadingViewTest.swift
│ │ └── __Snapshots__
│ │ └── LoadingViewTest
│ │ └── test_loadingView_whenSnapshot_shouldSucceed.1.png
├── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-4
├── OnboardingChallenge.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── dev.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── dev.jpeg
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── EmptyView
│ │ │ │ ├── EmptyView.swift
│ │ │ │ └── EmptyViewConfiguration.swift
│ │ │ ├── LicenseView
│ │ │ │ ├── LicenseView.swift
│ │ │ │ └── LicenseViewConfiguration.swift
│ │ │ ├── Loading
│ │ │ │ ├── LoadingView.swift
│ │ │ │ └── LoadingViewConfiguration.swift
│ │ │ └── RepositoryInfoView
│ │ │ │ ├── RepositoryInfoView.swift
│ │ │ │ └── RepositoryInfoViewConfiguration.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewConfiguration.swift
│ │ │ └── ListViewController.swift
│ │ └── Repository
│ │ │ ├── RepositoryCellView.swift
│ │ │ └── RepositoryCellViewConfiguration.swift
│ └── Service
│ │ ├── Service.swift
│ │ └── UserInfoModel.swift
├── OnboardingChallengeTests
│ ├── OnboardingChallengeTests.swift
│ ├── SnapshotTests
│ │ ├── EmptyViewSnapshotTests.swift
│ │ ├── LicenseViewSnapshotTests.swift
│ │ ├── LoadingViewSnapshotTests.swift
│ │ ├── RepositoryInfoViewTests.swift
│ │ └── __Snapshots__
│ │ │ ├── EmptyViewSnapshotTests
│ │ │ └── testEmptyView.1.png
│ │ │ ├── LicenseViewSnapshotTests
│ │ │ ├── testEmptyView.1.png
│ │ │ └── testLicenseView.1.png
│ │ │ ├── LoadingViewSnapshotTests
│ │ │ └── testLoadingView.1.png
│ │ │ └── RepositoryInfoViewTests
│ │ │ └── testRepositoryInfoView.1.png
│ └── UnitTests
│ │ └── StringUnitTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-5
├── OnboardingChallenge.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ ├── UIView+BorderBottom.swift
│ │ ├── UIView+Constraints.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Model
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── user-profile.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── user-profile.jpeg
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── EmptyView.swift
│ │ │ ├── LicenseView.swift
│ │ │ ├── LoadingView.swift
│ │ │ ├── OwnerView.swift
│ │ │ ├── RepositoryCellView.swift
│ │ │ └── RepositoryInfoView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewConfiguration.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ ├── Service
│ │ └── Service.swift
│ └── Utils
│ │ ├── RepositoryCellViewModel.swift
│ │ └── ViewCode.swift
├── OnboardingChallengeTests
│ └── OnboardingChallengeTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-6
├── OnboardingChallenge.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UINavigationController+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── RepositoriesModel.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── finn.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── finn.png
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── ButtonView.swift
│ │ │ ├── EmptyView.swift
│ │ │ ├── LoadingView.swift
│ │ │ ├── OwnerView.swift
│ │ │ └── RepositoryInfoView
│ │ │ │ ├── RepositoryInfoView.swift
│ │ │ │ └── RepositoryInfoViewConfiguration.swift
│ │ ├── Detail
│ │ │ ├── DetailViewController.swift
│ │ │ └── DetailsView.swift
│ │ ├── List
│ │ │ ├── Cell
│ │ │ │ └── RepositoryCellView.swift
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewConfiguration.swift
│ │ │ └── ListViewController.swift
│ │ ├── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ │ └── Views
│ │ │ └── ViewCode.swift
│ └── Service
│ │ └── Service.swift
├── OnboardingChallengeTests
│ └── OnboardingChallengeTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-attekita-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── GitHubApp.xcscheme
├── GitHubApp.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UIImageView+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── GitHubApp.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ ├── Contents.json
│ │ │ ├── SettingsTitleBGColor.colorset
│ │ │ │ └── Contents.json
│ │ │ └── SettingsTitleColor.colorset
│ │ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── ButtonView.swift
│ │ │ ├── LoadingView.swift
│ │ │ ├── OwnerView.swift
│ │ │ ├── RepositoryCellView.swift
│ │ │ ├── RepositoryInfoView.swift
│ │ │ └── ViewCodable.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ ├── DetailViewController.swift
│ │ │ ├── LicenseView.swift
│ │ │ └── Storyboard.storyboard
│ │ ├── Empty
│ │ │ └── EmptyView.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewConfiguration.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
├── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-bruno-ramos-5
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── GitHubApp.xcscheme
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Network
│ │ └── NetworkManager.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── ButtonView.swift
│ │ │ └── LoadingView.swift
│ │ ├── Detail
│ │ │ ├── Components
│ │ │ │ ├── LicenseView.swift
│ │ │ │ └── OwnerView.swift
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ ├── Protocols
│ │ │ └── ViewCode.swift
│ │ ├── Sample
│ │ │ ├── SampleConfigurator.swift
│ │ │ ├── SampleService.swift
│ │ │ ├── SampleView.swift
│ │ │ └── SampleViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ ├── Network
│ │ └── NetworkManagerTests.swift
│ ├── Screens
│ │ └── Sample
│ │ │ └── SampleServiceTests.swift
│ └── Service
│ │ └── SampleApiDataSourceTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-cecilia-saraiva-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ ├── Owner.swift
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Component
│ │ │ └── ButtonView.swift
│ │ ├── Components
│ │ │ └── EmptyView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewController.swift
│ │ │ ├── LoadingView.swift
│ │ │ ├── LoadingViewConfiguration.swift
│ │ │ └── RepositoryCell
│ │ │ │ ├── RepositoryCellModel.swift
│ │ │ │ └── RepositoryCellView.swift
│ │ ├── Resources
│ │ │ ├── EmptyViewStrings.strings
│ │ │ └── EmptyViewStrings.swift
│ │ ├── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ │ └── ViewConfiguration
│ │ │ ├── EmptyViewConfiguration.swift
│ │ │ └── ViewCodeProtocol.swift
│ └── Service
│ │ ├── APIError.swift
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-firas-safa-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Network
│ │ ├── Manager
│ │ │ ├── HTTPMethod.swift
│ │ │ ├── NetworkManager.swift
│ │ │ └── Typealiases.swift
│ │ ├── Models
│ │ │ └── Repository.swift
│ │ └── Requests
│ │ │ ├── GetUserRepos.swift
│ │ │ └── HTTPRequest.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ └── ButtonView
│ │ │ │ └── ButtonView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ ├── DetailViewController.swift
│ │ │ └── RepositoryInfoView.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewController.swift
│ │ │ └── ListViewModel.swift
│ │ ├── RepositoryCell
│ │ │ └── RepositoryCellView.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ ├── SettingsViewCell.swift
│ │ │ ├── SettingsViewController.swift
│ │ │ └── SettingsViewModel.swift
│ ├── Service
│ │ └── Service.swift
│ └── Utils
│ │ └── Utils.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-marcus-seixas-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ ├── GitHubApp.swift
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── Empty
│ │ │ ├── EmptyView.swift
│ │ │ └── ViewCodable.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ ├── Loader
│ │ │ └── LoadingView.swift
│ │ ├── RepositoryCellView
│ │ │ └── RepositoryCellView.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-matheus-reis-4
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ ├── Repository.swift
│ │ └── RepositoryViewCell.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ └── EmptyView
│ │ │ │ └── EmptyView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-matheus-reis-8
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── LoadingView.swift
│ │ │ └── RepositoryCellView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ ├── GitHubAppTests.swift
│ ├── LoadingViewTests.swift
│ ├── RepositoryCellViewTests.swift
│ └── __Snapshots__
│ │ ├── GitHubAppTests
│ │ └── testExample.1.png
│ │ ├── LoadingViewTests
│ │ └── testSnapshotLoadingView.1.png
│ │ └── SnapshotTestRepositoryCellView
│ │ └── testRepositoryCellView.1.png
├── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-rafael-silva-1
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Cell
│ │ │ └── RepositoryCellView.swift
│ │ ├── Components
│ │ │ ├── ButtonView.swift
│ │ │ ├── EmptyView.swift
│ │ │ └── LoadingView.swift
│ │ ├── Detail
│ │ │ ├── Components
│ │ │ │ ├── OwnerView.swift
│ │ │ │ └── RepositoryInfoView.swift
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-rafael-silva-2
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── EmptyView.swift
│ │ │ └── LoadingView.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewController.swift
│ │ │ └── RepositoryCellView.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ └── GitHubAppTests.swift
└── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── devsprint-renato-sarro-3
├── GitHubApp.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── GitHubApp.xcscheme
├── GitHubApp.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── Application
│ │ └── Screens
│ │ │ ├── Components
│ │ │ ├── EmptyView
│ │ │ │ └── EmptyView.swift
│ │ │ ├── RepositoryCell
│ │ │ │ └── RepositoryCellViewConfiguration.swift
│ │ │ └── Viewcode
│ │ │ │ └── Viewcode.swift
│ │ │ ├── Detail
│ │ │ ├── DetailStoryboard.storyboard
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ │ ├── List
│ │ │ ├── Cell
│ │ │ │ └── ListViewCell.swift
│ │ │ ├── ListView.swift
│ │ │ └── ListViewController.swift
│ │ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ ├── SettingsViewController.swift
│ │ │ └── StringsHelper.swift
│ ├── Data
│ │ ├── Models
│ │ │ └── Repository.swift
│ │ └── Repository
│ │ │ ├── RepositoriesRepository.swift
│ │ │ └── RepositoryRequest.swift
│ ├── Domain
│ │ ├── Network
│ │ │ ├── Repositories.swift
│ │ │ ├── Request.swift
│ │ │ └── Service.swift
│ │ ├── Repository
│ │ │ └── RepositoriesRepositoryProtocol.swift
│ │ └── UseCase
│ │ │ └── RepositoryUseCase.swift
│ ├── Infra
│ │ ├── AppDelegate
│ │ │ ├── AppDelegate.swift
│ │ │ └── SceneDelegate.swift
│ │ ├── DebugYourViews
│ │ │ └── DebugViewController.swift
│ │ └── Extensions
│ │ │ ├── String+Extensions.swift
│ │ │ ├── UIColor+Extensions.swift
│ │ │ ├── UITableViewCell+Extensions.swift
│ │ │ └── UIViewController+Extensions.swift
│ └── Resources
│ │ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── 100.png
│ │ │ ├── 1024.png
│ │ │ ├── 114.png
│ │ │ ├── 120.png
│ │ │ ├── 128.png
│ │ │ ├── 144.png
│ │ │ ├── 152.png
│ │ │ ├── 16.png
│ │ │ ├── 167.png
│ │ │ ├── 172.png
│ │ │ ├── 180.png
│ │ │ ├── 196.png
│ │ │ ├── 20.png
│ │ │ ├── 216.png
│ │ │ ├── 256.png
│ │ │ ├── 29.png
│ │ │ ├── 32.png
│ │ │ ├── 40.png
│ │ │ ├── 48.png
│ │ │ ├── 50.png
│ │ │ ├── 512.png
│ │ │ ├── 55.png
│ │ │ ├── 57.png
│ │ │ ├── 58.png
│ │ │ ├── 60.png
│ │ │ ├── 64.png
│ │ │ ├── 72.png
│ │ │ ├── 76.png
│ │ │ ├── 80.png
│ │ │ ├── 87.png
│ │ │ ├── 88.png
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
├── GitHubAppTests
│ ├── GitHubAppTests.swift
│ ├── Screens
│ │ └── List
│ │ │ ├── ListViewControllerSnapshotTest.swift
│ │ │ ├── ListViewControllerUnitTest.swift
│ │ │ └── __Snapshots__
│ │ │ ├── ListViewControllerSnapshotTest
│ │ │ └── test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png
│ │ │ └── ListViewControllerTest
│ │ │ └── test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png
│ └── Service
│ │ └── ServiceTest.swift
├── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── Podfile
└── Podfile.lock
├── devsprint-riccardo-1
├── .swiftformat
├── .swiftlint.yml
├── OnboardingChallenge.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── OnboardingChallenge
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ └── Resources
│ │ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ │ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
├── OnboardingChallengeKit
│ ├── .gitignore
│ ├── Package.swift
│ ├── README.md
│ ├── Sources
│ │ └── OnboardingChallengeKit
│ │ │ ├── Components
│ │ │ ├── ButtonView.swift
│ │ │ └── LicenseView.swift
│ │ │ ├── Extensions
│ │ │ ├── String+Extensions.swift
│ │ │ ├── UIColor+Extensions.swift
│ │ │ ├── UITableViewCell+Extensions.swift
│ │ │ └── UIViewController+Extensions.swift
│ │ │ ├── Helpers
│ │ │ └── SwiftUIPreView.swift
│ │ │ ├── Screens
│ │ │ ├── Detail
│ │ │ │ └── DetailViewController.swift
│ │ │ ├── EmptyView
│ │ │ │ └── EmptyView.swift
│ │ │ ├── List
│ │ │ │ ├── Cell
│ │ │ │ │ ├── RepositoryCellView.swift
│ │ │ │ │ └── RepositoryCellViewConfiguration.swift
│ │ │ │ ├── ListView.swift
│ │ │ │ ├── ListViewConfiguration.swift
│ │ │ │ └── ListViewController.swift
│ │ │ ├── LoadingView
│ │ │ │ └── LoadingView.swift
│ │ │ └── Settings
│ │ │ │ ├── Models
│ │ │ │ └── SettingsTitle.swift
│ │ │ │ ├── SettingsInteractor.swift
│ │ │ │ ├── SettingsViewModel.swift
│ │ │ │ └── Views
│ │ │ │ ├── Cell
│ │ │ │ └── SettingsCell.swift
│ │ │ │ ├── SettingsView.swift
│ │ │ │ └── SettingsViewController.swift
│ │ │ └── Service
│ │ │ ├── BundleService.swift
│ │ │ └── Service.swift
│ └── Tests
│ │ └── OnboardingChallengeKitTests
│ │ └── OnboardingChallengeKitTests.swift
└── OnboardingChallengeTests
│ └── OnboardingChallengeTests.swift
├── devsprint-rodrigo-borges-1
├── GitHubApp.xcodeproj
│ ├── .project.pbxproj.swp
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── GitHubApp.xcscheme
├── GitHubApp.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── GitHubApp
│ ├── AppDelegate
│ │ ├── AppDelegate.swift
│ │ └── SceneDelegate.swift
│ ├── DebugYourViews
│ │ └── DebugViewController.swift
│ ├── Extensions
│ │ ├── String+Extensions.swift
│ │ ├── UIColor+Extensions.swift
│ │ ├── UITableViewCell+Extensions.swift
│ │ └── UIViewController+Extensions.swift
│ ├── Models
│ │ └── Repository.swift
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── AccentColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ │ └── devpass-logo-blue copy.png
│ │ │ └── Contents.json
│ │ ├── Base.lproj
│ │ │ └── LaunchScreen.storyboard
│ │ └── Info.plist
│ ├── Screens
│ │ ├── Components
│ │ │ ├── EmptyView
│ │ │ │ ├── EmptyView.swift
│ │ │ │ └── EmptyViewConfiguration.swift
│ │ │ ├── LoadingView
│ │ │ │ ├── LoadingView.swift
│ │ │ │ └── LoadingViewConfiguration.swift
│ │ │ ├── RepositoryCellView.swift
│ │ │ ├── RepositoryInfoView
│ │ │ │ ├── RepositoryInfoView.swift
│ │ │ │ └── RepositoryInfoViewConfiguration.swift
│ │ │ └── ViewCode
│ │ │ │ └── ViewCode.swift
│ │ ├── Detail
│ │ │ ├── DetailView.swift
│ │ │ └── DetailViewController.swift
│ │ ├── List
│ │ │ ├── ListView.swift
│ │ │ ├── ListViewConfiguration.swift
│ │ │ └── ListViewController.swift
│ │ └── Settings
│ │ │ ├── SettingsView.swift
│ │ │ └── SettingsViewController.swift
│ └── Service
│ │ └── Service.swift
├── GitHubAppTests
│ ├── EmptyViewSnapshotTests.swift
│ ├── LoadingViewSnapshotTests.swift
│ ├── RepositoryCellViewSnapshotTests.swift
│ ├── RepositoryInfoUnitTests.swift
│ ├── UIViewControllerUnitTests.swift
│ └── __Snapshots__
│ │ ├── EmptyViewSnapshotTests
│ │ └── testEmptyView.1.png
│ │ ├── LoadingViewSnapshotTests
│ │ └── testLoadingView.1.png
│ │ └── RepositoryCellViewSnapshotTests
│ │ └── testRepositoyCellViewSnapshotTests.1.png
├── GitHubAppUITests
│ ├── GitHubAppUITests.swift
│ └── GitHubAppUITestsLaunchTests.swift
├── Podfile
└── Podfile.lock
└── devsprint-rodrigo-borges-2
├── GitHubApp.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── GitHubApp
├── AppDelegate
│ ├── AppDelegate.swift
│ └── SceneDelegate.swift
├── DebugYourViews
│ └── DebugViewController.swift
├── Extensions
│ ├── String+Extensions.swift
│ ├── UIColor+Extensions.swift
│ ├── UITableViewCell+Extensions.swift
│ └── UIViewController+Extensions.swift
├── Models
│ └── Repository.swift
├── Resources
│ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── devpass-logo-blue copy 2-1.png
│ │ │ ├── devpass-logo-blue copy 2.png
│ │ │ ├── devpass-logo-blue copy 3.png
│ │ │ ├── devpass-logo-blue copy 4.png
│ │ │ ├── devpass-logo-blue copy 5.png
│ │ │ └── devpass-logo-blue copy.png
│ │ └── Contents.json
│ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Screens
│ ├── Detail
│ │ ├── DetailView.swift
│ │ └── DetailViewController.swift
│ ├── List
│ │ ├── ListView.swift
│ │ └── ListViewController.swift
│ └── Settings
│ │ ├── SettingsView.swift
│ │ └── SettingsViewController.swift
└── Service
│ └── Service.swift
├── GitHubAppTests
└── GitHubAppTests.swift
└── GitHubAppUITests
├── GitHubAppUITests.swift
└── GitHubAppUITestsLaunchTests.swift
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 |
2 | ### Description of the new feature or improvement
3 |
4 |
5 | ### Checklist
6 | Put an ```x``` in the boxes that apply.
7 | - [] Implements all acceptance criteria as described on the Task Board
8 | - [] Does not add duplicate code
9 | - [] Does not contain commented code
10 | - [] Does not contain WIP code
11 |
12 | ### Screenshots
13 | | Screenshot 1 | Screenshot 2 |
14 | | ------ | ------ |
15 | | print | print |
16 |
--------------------------------------------------------------------------------
/bin/install_tooling.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if ! which swiftlint > /dev/null; then
3 | echo "installing swiftlint..."
4 | brew install swiftlint
5 | else
6 | echo "swift lint installed"
7 | fi
8 |
9 | if ! which swiftformat > /dev/null; then
10 | echo "installing swiftformat..."
11 | brew install swiftformat
12 | else
13 | echo "swiftformat installed"
14 | fi
--------------------------------------------------------------------------------
/screenshots/screenshot-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-1.png
--------------------------------------------------------------------------------
/screenshots/screenshot-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-2.png
--------------------------------------------------------------------------------
/screenshots/screenshot-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-3.png
--------------------------------------------------------------------------------
/screenshots/screenshot-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-4.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Fabio Martinez on 19/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Decodable {
11 |
12 | let name: String
13 | let id: Int
14 | let owner: Owner
15 | }
16 |
17 | struct Owner: Decodable {
18 |
19 | let avatarUrl: String
20 | let login: String?
21 | let id: Int
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/Buttons/ButtonView/ButtonViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ButtonViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Gustavo Rocha on 24/01/22.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 |
11 | struct ButtonViewConfiguration {
12 | let title: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/LoadingView/LoadingViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Fabio Martinez on 21/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LoadingViewConfiguration {
11 | let textLabel : String
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/Views/EmptyView/EmptyViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EmptyViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Gustavo Rocha on 20/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct EmptyViewConfiguration {
11 | let title: String
12 | let subTitle: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | init() {
13 | super.init(frame: .zero)
14 | backgroundColor = .white
15 | }
16 |
17 | required init?(coder: NSCoder) {
18 | fatalError("init(coder:) has not been implemented")
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/LoadingViewTest.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewTest.swift
3 | // GitHubAppTests
4 | //
5 | // Created by Fabio Martinez on 26/01/22.
6 | //
7 |
8 | import XCTest
9 | import SnapshotTesting
10 | @testable import GitHubApp
11 |
12 | class LoadingViewTest: XCTestCase {
13 |
14 | lazy var sut: LoadingView = .init()
15 |
16 | let snapshotSize = CGSize(width: 500, height: 200)
17 |
18 | func test_loadingView_whenSnapshot_shouldSucceed() {
19 | let configuration = LoadingViewConfiguration(textLabel: "Carregando...")
20 |
21 | sut.updateView(with: configuration)
22 |
23 | assertSnapshot(matching: sut, as: .image(size: snapshotSize))
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/__Snapshots__/LoadingViewTest/test_loadingView_whenSnapshot_shouldSucceed.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/__Snapshots__/LoadingViewTest/test_loadingView_whenSnapshot_shouldSucceed.1.png
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'GitHubApp' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for GitHubApp
9 |
10 | target 'GitHubAppTests' do
11 | inherit! :search_paths
12 | pod 'SnapshotTesting', '~> 1.9.0'
13 | end
14 |
15 | target 'GitHubAppUITests' do
16 | # Pods for testing
17 | end
18 |
19 |
20 |
21 | end
22 |
--------------------------------------------------------------------------------
/solutions/devpsrint-michael-douglas-1/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting (~> 1.9.0)
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: eed03f2b002b096b3f505e978b7cafe3aa66ec99
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | func removingSpaces() -> String {
13 |
14 | return self.replacingOccurrences(of: " ", with: "")
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "dev.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/dev.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/dev.jpeg
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Components/EmptyView/EmptyViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EmptyViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Murillo R. Araújo on 18/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct EmptyViewConfiguration {
11 | let titleMessage: String
12 | let emptyMessage: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Components/LicenseView/LicenseViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LicenseViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 21/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LicenseViewConfiguration {
11 |
12 | let name: String
13 | let code: String
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Components/Loading/LoadingViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Pedro Henrique on 18/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LoadingViewConfiguration {
11 | let message: String
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryInfoViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Fabio Martinez on 14/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 |
11 | struct RepositoryInfoViewConfiguration {
12 |
13 | var name: String
14 | var description: String
15 | var stars: Int
16 | var bifurcation: Int
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailsView.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Maíra Preto on 12/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 |
13 | /*
14 | // Only override draw() if you perform custom drawing.
15 | // An empty implementation adversely affects performance during animation.
16 | override func draw(_ rect: CGRect) {
17 | // Drawing code
18 | }
19 | */
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct ListViewConfiguration {
11 |
12 | let listItems: [String]
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Screens/Repository/RepositoryCellViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryCellViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Thiago Leite on 20/10/21.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 |
11 | struct RepositoryCellViewConfiguration {
12 | let ownerImage: UIImage
13 | let repoName: String
14 | let ownerName: String
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallenge/Service/UserInfoModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UserInfoModel.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Flavia Arsuffi on 15/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct UserInfoModel: Codable {
11 | var id: Int
12 | var name: String
13 | var description: String?
14 | var forks_count: Int
15 | var stargazers_count: Int
16 | var owner: Owner
17 | var license: License?
18 |
19 | }
20 |
21 | struct Owner: Codable {
22 | var login: String
23 | var avatar_url: String
24 | }
25 |
26 | struct License: Codable {
27 | var key: String
28 | var name: String
29 | var spdx_id: String
30 | var url: String?
31 | }
32 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/LoadingViewSnapshotTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewSnapshotTests.swift
3 | // OnboardingChallengeTests
4 | //
5 | // Created by Pedro Henrique on 22/10/21.
6 | //
7 |
8 | import XCTest
9 | import SnapshotTesting
10 | @testable import OnboardingChallenge
11 |
12 | class LoadingViewSnapshotTests: XCTestCase {
13 |
14 | let snapshotSize = CGSize(width: 500, height: 500)
15 |
16 | func testLoadingView() {
17 | let configuration = LoadingViewConfiguration(message: "Searching repositories...")
18 | let loadingView = LoadingView()
19 |
20 | loadingView.updateView(with: configuration)
21 | assertSnapshot(matching: loadingView, as: .image(size: snapshotSize))
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testEmptyView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testEmptyView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testLicenseView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testLicenseView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/RepositoryInfoViewTests/testRepositoryInfoView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/RepositoryInfoViewTests/testRepositoryInfoView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-4/OnboardingChallengeTests/UnitTests/StringUnitTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringUnitTests.swift
3 | // OnboardingChallengeTests
4 | //
5 | // Created by Murillo R. Araújo on 14/10/21.
6 | //
7 |
8 | import XCTest
9 | @testable import OnboardingChallenge
10 |
11 | class StringUnitTests: XCTestCase {
12 |
13 | func testRemovingSpaces() throws {
14 | // Given
15 | let input: String = "Unit Test"
16 | let expected: String = "UnitTest"
17 |
18 | //When
19 | let result = input.removingSpaces()
20 |
21 | XCTAssertEqual(result, expected)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'OnboardingChallenge' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for OnboardingChallenge
9 |
10 | target 'OnboardingChallengeTests' do
11 | inherit! :search_paths
12 | # Pods for testing
13 |
14 | pod 'SnapshotTesting'
15 | end
16 |
17 | end
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-4/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: 45562f1da4197e4c8b60398011aef27c3413d322
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(starsCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(starsCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Extensions/UIView+BorderBottom.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+BorderBottom.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Guilherme Strutzki on 19/11/21.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 |
11 | extension UIView {
12 | enum ViewSide {
13 | case Left, Right, Top, Bottom
14 | }
15 |
16 | func addBottomBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
17 | let border = UIView()
18 | border.backgroundColor = color
19 | border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
20 | border.frame = CGRect(x: 0, y: frame.size.height - borderWidth, width: frame.size.width, height: borderWidth)
21 | addSubview(border)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Model/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Diego Fernando on 09/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Decodable {
11 | let name: String
12 | let owner: Owner
13 | }
14 |
15 | struct Owner: Decodable {
16 |
17 | let login: String
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "user-profile.jpeg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/user-profile.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/user-profile.jpeg
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 |
14 | self.view = DetailView()
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct ListViewConfiguration {
11 | let listItems: [Repository]
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Francischett Occhiuto on 13/11/21.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 |
11 | class SettingsView: UIView {
12 | init () {
13 | super.init(frame: .zero)
14 | backgroundColor = .white
15 | }
16 |
17 | required init?(coder: NSCoder) {
18 | fatalError("init(coder:) has not been implemented")
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 | override func loadView() {
12 | self.view = SettingsView()
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Utils/RepositoryCellViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryCellViewModel.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Guilherme Strutzki on 10/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoryCellViewModel {
11 | var name: String
12 | var ownerUsername: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/OnboardingChallenge/Utils/ViewCode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCode.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Guilherme Strutzki on 10/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol ViewCode {
11 | func buildViewHierarchy()
12 | func addConstraints()
13 | func additionalConfiguration()
14 | func setup()
15 | }
16 | extension ViewCode {
17 | func setup() {
18 | buildViewHierarchy()
19 | addConstraints()
20 | additionalConfiguration()
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'OnboardingChallenge' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for OnboardingChallenge
9 |
10 | target 'OnboardingChallengeTests' do
11 | inherit! :search_paths
12 |
13 | pod 'SnapshotTesting'
14 | end
15 |
16 | end
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-5/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: 8107f0ef2fce8da6d6bce62c949c5b732294accd
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Extensions/UINavigationController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UINavigationController+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Pedro Gabriel on 09/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UINavigationController {
11 | func setupLightGrayAppearance() {
12 | let navBarAppearance = UINavigationBarAppearance()
13 | navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.black]
14 | navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.black]
15 | navBarAppearance.backgroundColor = .systemGray6
16 | navigationBar.standardAppearance = navBarAppearance
17 | navigationBar.scrollEdgeAppearance = navBarAppearance
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Models/RepositoriesModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoriesModel.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Marcos Jr on 10/11/21.
6 |
7 |
8 | import Foundation
9 |
10 | // MARK: - RepositoryModel
11 | struct RepositoriesModel: Codable {
12 | let id: Int
13 | let name: String
14 | let owner: Owner
15 | let stargazersCount: Int
16 | let language: String?
17 | let forksCount: Int
18 | }
19 |
20 | // MARK: - Owner
21 | struct Owner: Codable {
22 | let login: String
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "finn.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/finn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/finn.png
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryInfoViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Mateus Coelho on 18/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoryInfoViewConfiguration {
11 | var name: String
12 | var description: String
13 | var stars: Int
14 | var bifurcations: Int
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewConfiguration.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct ListViewConfiguration {
11 |
12 | let repositories: [RepositoriesModel]
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController{
11 |
12 | init(){
13 | super.init(nibName: nil, bundle: nil)
14 | navigationItem.title = "Settings"
15 | }
16 |
17 | required init?(coder: NSCoder) {
18 | fatalError("init(coder:) has not been implemented")
19 | }
20 |
21 | override func loadView() {
22 | self.view = SettingsView()
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/OnboardingChallenge/Screens/Views/ViewCode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCode.swift
3 | // OnboardingChallenge
4 | //
5 | // Created by Gustavo Soares on 09/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol ViewCode {
11 | func configureSubViews()
12 | func configureSubviewsConstraints()
13 | func configureAdditionalBehaviors()
14 | }
15 |
16 | extension ViewCode {
17 | public func setupViews() {
18 | configureSubViews()
19 | configureSubviewsConstraints()
20 | configureAdditionalBehaviors()
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'OnboardingChallenge' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for OnboardingChallenge
9 |
10 | target 'OnboardingChallengeTests' do
11 | inherit! :search_paths
12 | # Pods for testing
13 |
14 | pod 'SnapshotTesting'
15 | end
16 |
17 | end
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-6/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: 45562f1da4197e4c8b60398011aef27c3413d322
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Extensions/UIImageView+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIImageView+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Giovanna Moeller on 19/01/22.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 |
11 | extension UIImageView {
12 |
13 | func makeItRounded() {
14 | self.layer.cornerRadius = self.frame.size.height / 2
15 | self.layer.masksToBounds = true
16 | self.clipsToBounds = true
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Models/GitHubApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GitHubApp.swift
3 | // GitHubApp
4 | //
5 | // Created by Michelli Cristina de Paulo Lima on 19/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct GitHubApp: Codable {
11 | var name: String
12 | var description: String?
13 | var stargazersCount: Int
14 | var watchersCount: Int
15 | var owner: Owner
16 | }
17 |
18 | struct Owner: Codable {
19 | var login: String
20 | var avatarUrl: String
21 | var type: String
22 | }
23 |
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Screens/Components/ViewCodable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCodable.swift
3 | // GitHubApp
4 | //
5 | // Created by Luiza on 19/01/22.
6 | //
7 |
8 |
9 | import Foundation
10 |
11 | public protocol ViewCodable {
12 |
13 | func buildHierarchy()
14 |
15 | func setupConstraints()
16 |
17 | func applyAdditionalChanges()
18 | }
19 |
20 | public extension ViewCodable {
21 |
22 | func setupView() {
23 | buildHierarchy()
24 | setupConstraints()
25 | applyAdditionalChanges()
26 | }
27 |
28 | func buildHierarchy() {}
29 |
30 | func setupConstraints() {}
31 |
32 | func applyAdditionalChanges() {}
33 | }
34 |
35 |
36 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 |
13 | override func loadView() {
14 | view = DetailView()
15 |
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | enum ListViewConfiguration {
11 | case empty
12 | case loading
13 | case list(_: [GitHubApp])
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | final class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | let appearance = UINavigationBarAppearance()
15 | appearance.backgroundColor = UIColor(named: "SettingsTitleBGColor")
16 | appearance.titleTextAttributes = [.foregroundColor: UIColor(named: "SettingsTitleColor") ?? .black]
17 | navigationController?.navigationBar.scrollEdgeAppearance = appearance
18 | title = "Settings"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'GitHubApp' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for GitHubApp
9 | pod 'Kingfisher', '~> 7.0'
10 |
11 | target 'GitHubAppTests' do
12 | inherit! :search_paths
13 | # Pods for testing
14 | pod 'SnapshotTesting', '~> 1.9.0'
15 | end
16 |
17 | target 'GitHubAppUITests' do
18 | # Pods for testing
19 | end
20 |
21 | end
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-attekita-1/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Kingfisher (7.1.1)
3 | - SnapshotTesting (1.9.0)
4 |
5 | DEPENDENCIES:
6 | - Kingfisher (~> 7.0)
7 | - SnapshotTesting (~> 1.9.0)
8 |
9 | SPEC REPOS:
10 | trunk:
11 | - Kingfisher
12 | - SnapshotTesting
13 |
14 | SPEC CHECKSUMS:
15 | Kingfisher: f738f9c4a3415823b8e2985d10aa2d6a9f37bc4d
16 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
17 |
18 | PODFILE CHECKSUM: 8f6e167bb1f6c12e9c1d634b11c8abf0c7d6c86a
19 |
20 | COCOAPODS: 1.11.2
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository {
11 | let name: String
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Protocols/ViewCode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCode.swift
3 | // GitHubApp
4 | //
5 | // Created by Vitor Conceicao on 06/07/22.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol ViewCode {
11 | func setupSubviews()
12 | func setupConstraint()
13 | func setupExtraConfiguration()
14 | func setup()
15 | }
16 |
17 | extension ViewCode {
18 | func setup() {
19 | setupSubviews()
20 | setupConstraint()
21 | setupExtraConfiguration()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Sample/SampleConfigurator.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | enum SampleConfigurator {
4 | static func make() -> UIViewController {
5 | let session = URLSession.shared
6 | let network = NetworkManager(session: session)
7 | let localDataSource = SampleApiDataSource(network: network)
8 | let service = SampleService(dataSource: localDataSource)
9 | let customView = SampleView()
10 | let viewController = SampleViewController(service: service, customView: customView)
11 | return viewController
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | private let sectionTitle = "APP VERSION"
13 | private let sectionItems = ["Version 1.0"]
14 |
15 | private let settingsView = SettingsView()
16 |
17 | override func loadView() {
18 | self.view = settingsView
19 | }
20 |
21 | override func viewDidLoad() {
22 | super.viewDidLoad()
23 |
24 | settingsView.addSection(section: .init(title: sectionTitle, values: sectionItems))
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Models/Owner.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Owner.swift
3 | // GitHubApp
4 | //
5 | // Created by Amaryllis Baldrez on 27/07/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Owner: Codable {
11 | let login: String
12 | let avatarUrl: String
13 |
14 | enum CodingKeys: String, CodingKey {
15 | case login
16 | case avatarUrl = "avatar_url"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Codable {
11 | let name: String
12 | let owner: Owner
13 | }
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/List/LoadingViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Pierre Youness on 29/07/2022.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LoadingViewConfiguration {
11 | let description: String
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/List/RepositoryCell/RepositoryCellModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryCellModel.swift
3 | // GitHubApp
4 | //
5 | // Created by Pierre Youness on 28/07/2022.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoryCellModel {
11 | let name: String
12 | let owner: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Resources/EmptyViewStrings.strings:
--------------------------------------------------------------------------------
1 |
2 | "emptyViewTitle" = "No repositories found";
3 | "emptyViewSubtitle" = "Search for users to see their public repositories here!";
4 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Resources/EmptyViewStrings.swift:
--------------------------------------------------------------------------------
1 |
2 | import Foundation
3 |
4 | enum EmptyViewString: String {
5 |
6 | case emptyViewTitle
7 | case emptyViewSubtitle
8 |
9 | var localized: String {
10 | return self.rawValue.localized(tableName: "EmptyViewStrings")
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/ViewConfiguration/EmptyViewConfiguration.swift:
--------------------------------------------------------------------------------
1 |
2 | import Foundation
3 |
4 | struct EmptyViewConfiguration {
5 | let title: String
6 | let subtitle: String
7 | }
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/ViewConfiguration/ViewCodeProtocol.swift:
--------------------------------------------------------------------------------
1 |
2 | import Foundation
3 |
4 | protocol ViewConfiguration: AnyObject {
5 | func setupViews()
6 | func configureViews()
7 | func buildViews()
8 | func setupConstraints()
9 | }
10 |
11 | extension ViewConfiguration {
12 | func setupViews() {
13 | self.configureViews()
14 | self.buildViews()
15 | self.setupConstraints()
16 |
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Service/APIError.swift:
--------------------------------------------------------------------------------
1 | //
2 | // APIError.swift
3 | // GitHubApp
4 | //
5 | // Created by Amaryllis Baldrez on 29/07/22.
6 | //
7 |
8 | import Foundation
9 |
10 | enum APIError: Error {
11 | case URLError
12 | case ParseError
13 | case emptyData
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Network/Manager/HTTPMethod.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HTTPMethod.swift
3 | // GitHubApp
4 | //
5 | // Created by Razee Hussein-Jamal on 09/02/2022.
6 | //
7 |
8 | import Foundation
9 |
10 | // Type representing `HTTPMethods`
11 | enum HTTPMethod: String {
12 | case get = "GET"
13 | }
14 |
15 | // Type representing `URLs`
16 | enum URLs: String {
17 | // API endpoint to github api
18 | case githubAPI = "api.github.com"
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Network/Manager/Typealiases.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Typealiases.swift
3 | // GitHubApp
4 | //
5 | // Created by Razee Hussein-Jamal on 12/02/2022.
6 | //
7 |
8 | import Foundation
9 |
10 | // A dictionary to be encoded and sent with the network request
11 | // There is no use case for `Parameters` therefore it has not been used
12 | typealias Parameters = [String: String]
13 |
14 | // A path that identifies the resource at the end of a Url
15 | typealias Path = [String]
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Network/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | // MARK: - Repository
11 |
12 | struct Repository: Decodable {
13 | let id: Int
14 |
15 | enum CodingKeys: String, CodingKey {
16 | case id
17 |
18 | }
19 | }
20 |
21 | // MARK: - Owner
22 |
23 | struct Owner: Decodable {
24 | let id: Int
25 |
26 | enum CodingKeys: String, CodingKey {
27 | case id
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Network/Requests/GetUserRepos.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GetUserRepos.swift
3 | // GitHubApp
4 | //
5 | // Created by Razee Hussein-Jamal on 12/02/2022.
6 | //
7 |
8 | import Foundation
9 |
10 | struct GetUserRepos: HTTPRequest {
11 | typealias ResponseModel = Repository
12 | var host: URLs = .githubAPI
13 | var path: Path
14 | var method: HTTPMethod = .get
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/List/ListViewModel.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | struct ListViewModel {
4 | private var listItems: [String]
5 |
6 | var rowCount: Int {
7 | listItems.count
8 | }
9 |
10 | init(listItems: [String] = []) {
11 | self.listItems = listItems
12 | }
13 |
14 | func getItemFor(_ index: Int) -> String {
15 | listItems[index]
16 | }
17 |
18 | func getCellFor(_ index: Int) -> RepositoryCellViewConfiguration {
19 | let item = listItems[index]
20 | return RepositoryCellViewConfiguration(title: item, subtitle: item)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewCell.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | class SettingsViewCell: UITableViewCell {
4 | static let cellIdentifier = "SettingsCell"
5 | }
6 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | title = "Settings"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | struct SettingsViewModel {
4 | private let appVersion = Utils.appVersion
5 | private let header = "APP VERSTION"
6 |
7 | var rowCount: Int {
8 | 1
9 | }
10 |
11 | func getCellFor(_ index: Int) -> String {
12 | "Version " + appVersion
13 | }
14 |
15 | func getHeaderFor(_ index: Int) -> String {
16 | header
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Service/Service.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Service.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 30/09/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Service {
11 |
12 | func fetchList(_ completion: ([String]) -> Void) {
13 |
14 | completion(["Repository 1", "Repository 2", "Repository 3"])
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-firas-safa-1/GitHubApp/Utils/Utils.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | enum Utils {
4 | static let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Missing app version"
5 | }
6 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Models/GitHubApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GitHubApp.swift
3 | // GitHubApp
4 | //
5 | // Created by Rafael Mazzoco on 01/12/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct GitHubApp: Codable {
11 | var name: String
12 | var description: String?
13 | var stargazersCount: Int
14 | var watcherCount: Int
15 | var owner: Owner
16 | }
17 |
18 | struct Owner: Codable {
19 | var login: String
20 | var avatarUrl: String
21 | var type: String
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository {
11 | let name: String
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Empty/ViewCodable.swift:
--------------------------------------------------------------------------------
1 | // ViewCodable.swift
2 | // GitHubApp
3 | //
4 | // Created by Rafael Mazzoco on 23/11/22.
5 | //
6 |
7 | import Foundation
8 |
9 |
10 | public protocol ViewCodable {
11 |
12 | func buildHierarchy()
13 |
14 | func setupConstraints()
15 |
16 | func applyAdditionalChanges()
17 | }
18 |
19 | //
20 | public extension ViewCodable {
21 |
22 | func setupView() {
23 | buildHierarchy()
24 | setupConstraints()
25 | applyAdditionalChanges()
26 | }
27 |
28 | func buildHierarchy() {}
29 |
30 | func setupConstraints() {}
31 |
32 | func applyAdditionalChanges() {}
33 | }
34 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository {
11 | let name: String
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-4/GitHubApp/Service/Service.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Service.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 30/09/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Service {
11 |
12 | func fetchList(_ completion: ([String]) -> Void) {
13 |
14 | completion(["Repository 1", "Repository 2", "Repository 3"])
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository {
11 | let name: String
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubApp/Service/Service.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Service.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 30/09/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Service {
11 |
12 | func fetchList(_ completion: ([String]) -> Void) {
13 |
14 | completion(["Repository 1", "Repository 2", "Repository 3"])
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/GitHubAppTests/testExample.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/GitHubAppTests/testExample.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/LoadingViewTests/testSnapshotLoadingView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/LoadingViewTests/testSnapshotLoadingView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/SnapshotTestRepositoryCellView/testRepositoryCellView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/SnapshotTestRepositoryCellView/testRepositoryCellView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'GitHubApp' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for GitHubApp
9 |
10 | target 'GitHubAppTests' do
11 | inherit! :search_paths
12 | pod 'SnapshotTesting', '~> 1.9'
13 | # Pods for testing
14 | end
15 |
16 | target 'GitHubAppUITests' do
17 | # Pods for testing
18 | end
19 |
20 | end
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-matheus-reis-8/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting (~> 1.9)
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: ddf04402787fa42c500f5724d8ff155a39472aa6
15 |
16 | COCOAPODS: 1.12.0
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | extension String {
4 |
5 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
6 |
7 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 |
16 | override func viewDidLoad() {
17 | self.navigationItem.title = "Settings"
18 |
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Codable {
11 | let name: String
12 | let owner: Login
13 | }
14 |
15 | struct Login: Codable {
16 | let login: String
17 | }
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Components/RepositoryCell/RepositoryCellViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryCellViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Thyago Raphael on 24/05/22.
6 | //
7 |
8 | import UIKit
9 |
10 | struct RepositoryCellViewConfiguration {
11 | let name: String
12 | let description: String
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Components/Viewcode/Viewcode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCode.swift
3 | // GitHubApp
4 | //
5 | // Created by Thyago Raphael on 25/05/22.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol Viewcode {
11 | func buildHierarchy()
12 | func setupConstraints()
13 | func setupExtraConfiguration()
14 | }
15 |
16 | extension Viewcode {
17 | func setupViewCode() {
18 | buildHierarchy()
19 | setupConstraints()
20 | setupExtraConfiguration()
21 | }
22 |
23 | func setupExtraConfiguration() { }
24 | }
25 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Settings/StringsHelper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringsHelper.swift
3 | // GitHubApp
4 | //
5 | // Created by Tatiana Rico on 23/05/22.
6 | //
7 |
8 | /**
9 | Arquivo para centralizar todas as 'STRINGS' do projeto.
10 | 1. Manter em ordem alfabetica, para não repetir string
11 | **/
12 |
13 | import Foundation
14 |
15 | class StringsHelper {
16 | static let TITLE_EMPTYVIEW = "No repositores found"
17 | static let TEXT_EMPTYVIEW = "Search for users to see their public repositores here"
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Data/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Decodable {
11 | let name: String
12 | let description: String?
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Data/Repository/RepositoriesRepository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoriesRepository.swift
3 | // GitHubApp
4 | //
5 | // Created by Renato Sarro on 01/06/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoriesRepository: RepositoriesRepositoryProtocol {
11 |
12 | private let service: ServiceProtocol
13 |
14 | init(service: ServiceProtocol = Service()) {
15 | self.service = service
16 | }
17 |
18 | func fetchRepositoryList(user: String, completion: @escaping (Result<[Repository], ApiError>) -> Void) {
19 | service.fetchData(request: RepositoryRequest(user: user)) { (result: Result<[Repository], ApiError>) in
20 | completion(result)
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Data/Repository/RepositoryRequest.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryRequest.swift
3 | // GitHubApp
4 | //
5 | // Created by Renato Sarro on 31/05/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoryRequest: RequestProtocol {
11 | var url: String {
12 | return "https://api.github.com/users/\(user)/repos"
13 | }
14 |
15 | var parameres: [String : Any] {
16 | return [:]
17 | }
18 |
19 | var method: HTTPMethod {
20 | return .get
21 | }
22 |
23 | var user: String
24 | }
25 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Network/Repositories.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repositories.swift
3 | // GitHubApp
4 | //
5 | // Created by Vinicius Rodrigues on 25/05/22.
6 | //
7 |
8 | import Foundation
9 |
10 | class Repositories {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Network/Request.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Request.swift
3 | // GitHubApp
4 | //
5 | // Created by Renato Sarro on 31/05/22.
6 | //
7 |
8 | import Foundation
9 |
10 | enum HTTPMethod: String {
11 | case get = "GET"
12 | case post = "POST"
13 | case delete = "DELETE"
14 | }
15 |
16 | protocol RequestProtocol {
17 | var url: String { get }
18 | var parameres: [String: Any] { get }
19 | var method: HTTPMethod { get }
20 | }
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Repository/RepositoriesRepositoryProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoriesRepositoryProtocol.swift
3 | // GitHubApp
4 | //
5 | // Created by Renato Sarro on 01/06/22.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol RepositoriesRepositoryProtocol {
11 | func fetchRepositoryList(user: String, completion: @escaping (Result<[Repository], ApiError>) -> Void)
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/100.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/114.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/128.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/144.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/152.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/16.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/167.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/172.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/172.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/196.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/196.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/20.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/216.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/216.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/256.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/32.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/48.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/50.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/512.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/55.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/55.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/57.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/64.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/72.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/76.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/88.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/88.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/ListViewControllerSnapshotTest.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewControllerSnapshotTest.swift
3 | // GitHubAppTests
4 | //
5 | // Created by Renato Sarro on 26/05/22.
6 | //
7 |
8 | import Foundation
9 | import SnapshotTesting
10 | import XCTest
11 |
12 | @testable import GitHubApp
13 |
14 | class ListViewControllerSnapshotTest: XCTestCase {
15 |
16 | var sut: ListViewController!
17 |
18 | override func setUp() {
19 | sut = ListViewController()
20 | }
21 |
22 | func test_WhenPresentListViewController_ShouldHaveValidSnapshot() {
23 | assertSnapshot(matching: UINavigationController(rootViewController: sut), as: .image(on: .iPhoneX))
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerSnapshotTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerSnapshotTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | platform :ios, '15.2'
3 |
4 | target 'GitHubApp' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for GitHubApp
9 |
10 | target 'GitHubAppTests' do
11 | inherit! :search_paths
12 | # Pods for testing
13 | pod 'SnapshotTesting', '~> 1.9.0'
14 | end
15 |
16 | target 'GitHubAppUITests' do
17 | # Pods for testing
18 | end
19 |
20 | end
21 |
--------------------------------------------------------------------------------
/solutions/devsprint-renato-sarro-3/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting (~> 1.9.0)
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: aff12353989e2944c22c7ce27b78df3f74d1b9a2
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallenge/AppDelegate/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import OnboardingChallengeKit
4 | import UIKit
5 |
6 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
7 | var window: UIWindow?
8 |
9 | func scene(_ scene: UIScene, willConnectTo _: UISceneSession, options _: UIScene.ConnectionOptions) {
10 | guard let windowScene = (scene as? UIWindowScene) else { return }
11 |
12 | self.window = UIWindow(frame: UIScreen.main.bounds)
13 | self.window?.rootViewController = UINavigationController(rootViewController: ListViewController())
14 | self.window?.windowScene = windowScene
15 | self.window?.makeKeyAndVisible()
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallenge/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallenge/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | /.build
3 | /Packages
4 | /*.xcodeproj
5 | xcuserdata/
6 | DerivedData/
7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/README.md:
--------------------------------------------------------------------------------
1 | # OnboardingChallengeKit
2 |
3 | Package that contains the OnboardingChallenge application.
4 | This package lets us avoid any conflicts in the xcodeproj file and it enables modularization.
5 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | extension String {
6 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
7 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import UIKit
4 |
5 | extension UIColor {
6 | convenience init(red: Int, green: Int, blue: Int) {
7 | self.init(
8 | red: CGFloat(red) / 255.0,
9 | green: CGFloat(green) / 255.0,
10 | blue: CGFloat(blue) / 255.0,
11 | alpha: 1
12 | )
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import UIKit
4 |
5 | extension UITableViewCell {
6 | class func classIdentifier() -> String {
7 | guard let className = String(describing: self).components(separatedBy: ".").last else {
8 | return ""
9 | }
10 |
11 | return className
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import UIKit
4 |
5 | extension UIViewController {
6 | func insideNavigationController() -> UINavigationController {
7 | let navigationController = UINavigationController(rootViewController: self)
8 | navigationController.modalPresentationStyle = .formSheet
9 |
10 | return navigationController
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import UIKit
4 |
5 | class DetailViewController: UIViewController {}
6 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/List/Cell/RepositoryCellViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | struct RepositoryCellViewConfiguration {
6 | var repositoryName: String
7 | var repositoryOwnerName: String
8 | }
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | struct ListViewConfiguration {
6 | let listItems: [RepositoryCellViewConfiguration]
7 | }
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/Models/SettingsTitle.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | enum SettingsTitle {
6 | case appVersion
7 |
8 | var value: String {
9 | switch self {
10 | case .appVersion: return "App Version"
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/SettingsInteractor.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | protocol LoadingPropertyInfo {
6 | func getAppVersion() -> SettingsViewModel
7 | }
8 |
9 | class SettingsInteractor: LoadingPropertyInfo {
10 | var bundleService: BundleService
11 |
12 | init(bundleService: BundleService) {
13 | self.bundleService = bundleService
14 | }
15 |
16 | func getAppVersion() -> SettingsViewModel {
17 | let version = self.bundleService.appVersion
18 | let viewModel = SettingsViewModel(title: .appVersion, items: ["Version " + version])
19 | return viewModel
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/SettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | struct SettingsViewModel {
6 | let title: SettingsTitle
7 | let items: [String]
8 |
9 | init(title: SettingsTitle, items: [String]) {
10 | self.title = title
11 | self.items = items
12 | }
13 |
14 | var count: Int {
15 | return self.items.count
16 | }
17 |
18 | var titleForSection: String {
19 | return self.title.value
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Service/BundleService.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | protocol BundleService {
6 | var appVersion: String { get }
7 | }
8 |
9 | extension Bundle: BundleService {
10 | var appVersion: String {
11 | guard let result = infoDictionary?["CFBundleShortVersionString"] as? String else { return "" }
12 | return result
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Service/Service.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import Foundation
4 |
5 | protocol ServiceProtocol {
6 | func fetchList(_ completion: ([RepositoryCellViewConfiguration]) -> Void)
7 | }
8 |
9 | struct Service: ServiceProtocol {
10 | func fetchList(_ completion: ([RepositoryCellViewConfiguration]) -> Void) {
11 | completion([
12 | RepositoryCellViewConfiguration(repositoryName: "hereminders-ios", repositoryOwnerName: "rdgborges"),
13 | RepositoryCellViewConfiguration(repositoryName: "hereminders-ios", repositoryOwnerName: "mateusnazarioc"),
14 | ])
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeKit/Tests/OnboardingChallengeKitTests/OnboardingChallengeKitTests.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import XCTest
4 | @testable import OnboardingChallengeKit
5 |
6 | final class OnboardingChallengeKitTests: XCTestCase {}
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-riccardo-1/OnboardingChallengeTests/OnboardingChallengeTests.swift:
--------------------------------------------------------------------------------
1 | // Copyright © 2021 DevPass. All rights reserved.
2 |
3 | import XCTest
4 |
5 | class OnboardingChallengeTests: XCTestCase {
6 | func testExample() throws {
7 | XCTSkip()
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/.project.pbxproj.swp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/.project.pbxproj.swp
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Pedro Francisco Tres on 17/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository: Codable {
11 | let id: Int
12 | let name, fullName: String
13 | let owner: Owner
14 |
15 |
16 | enum CodingKeys: String, CodingKey {
17 | case id
18 | case name
19 | case fullName = "full_name"
20 | case owner
21 |
22 | }
23 | }
24 |
25 | struct Owner: Codable {
26 | let login: String?
27 | let id: Int
28 |
29 |
30 | enum CodingKeys: String, CodingKey {
31 | case login, id
32 |
33 | }
34 | }
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/EmptyView/EmptyViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EmptyModel.swift
3 | // GitHubApp
4 | //
5 | // Created by Tania Mara Alves Ferreira on 21/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct EmptyViewConfiguration {
11 | let title: String
12 | let subtitle: String
13 |
14 | init(title: String, subtitle: String) {
15 | self.title = title
16 | self.subtitle = subtitle
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/LoadingView/LoadingViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LoadingViewModel.swift
3 | // GitHubApp
4 | //
5 | // Created by Felipe Forcinetti on 18/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LoadingViewConfiguration {
11 | let textLabel: String
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryInfoViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Pedro Francisco Tres on 27/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct RepositoryInfoViewConfiguration {
11 | var title: String
12 | var description: String
13 | var stars: Int
14 | var bifurcations: Int
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/ViewCode/ViewCode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewCode.swift
3 | // GitHubApp
4 | //
5 | // Created by Pedro Francisco Tres on 27/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | protocol ViewCode {
11 | func configureSubViews()
12 | func configureSubviewsConstraints()
13 | func configureAdditionalBehaviors()
14 | }
15 |
16 | extension ViewCode {
17 | public func setupViews() {
18 | configureSubViews()
19 | configureSubviewsConstraints()
20 | configureAdditionalBehaviors()
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/List/ListViewConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ListViewConfiguration.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | enum ListViewConfiguration {
11 | case loading
12 | case empty
13 | case list(_: [Repository])
14 | }
15 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | init() {
13 | super.init(nibName: nil, bundle: nil)
14 | }
15 |
16 | required init?(coder: NSCoder) {
17 | fatalError("init(coder:) has not been implemented")
18 | }
19 |
20 | override func loadView() {
21 | self.view = SettingsView()
22 | }
23 |
24 | override func viewDidLoad() {
25 | super.viewDidLoad()
26 | title = "Settings"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/RepositoryInfoUnitTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RepositoryInfoUnitTests.swift
3 | // GitHubAppTests
4 | //
5 | // Created by Pedro Francisco Tres on 25/01/22.
6 | //
7 |
8 | import XCTest
9 | @testable import GitHubApp
10 |
11 | class RepositoryInfoUnitTests: XCTestCase {
12 |
13 | func testRepositoryInfo() throws {
14 | let repository = String.repositoryInfo(repositoriesCount: 1, bifurcationsCount: 2)
15 | XCTAssertEqual(repository, "1 stars 2 bifurcations")
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/UIViewControllerUnitTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewControllerUnitTests.swift
3 | // GitHubAppTests
4 | //
5 | // Created by Pedro Francisco Tres on 23/01/22.
6 | //
7 |
8 | import XCTest
9 | @testable import GitHubApp
10 |
11 | class UIViewControllerUnitTests: XCTestCase {
12 |
13 | func testInsideNavigationController() throws {
14 |
15 | let viewController = UIViewController()
16 |
17 | let navigationController = viewController.insideNavigationController()
18 |
19 | XCTAssert(navigationController.viewControllers.first == viewController)
20 | XCTAssert(navigationController.modalPresentationStyle == .formSheet)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/RepositoryCellViewSnapshotTests/testRepositoyCellViewSnapshotTests.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/RepositoryCellViewSnapshotTests/testRepositoyCellViewSnapshotTests.1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'GitHubApp' do
5 | # Comment the next line if you don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for GitHubApp
9 |
10 | target 'GitHubAppTests' do
11 | inherit! :search_paths
12 | pod 'SnapshotTesting', '~> 1.9.0'
13 | end
14 |
15 | target 'GitHubAppUITests' do
16 | # Pods for testing
17 | end
18 |
19 | end
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-1/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - SnapshotTesting (1.9.0)
3 |
4 | DEPENDENCIES:
5 | - SnapshotTesting (~> 1.9.0)
6 |
7 | SPEC REPOS:
8 | trunk:
9 | - SnapshotTesting
10 |
11 | SPEC CHECKSUMS:
12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
13 |
14 | PODFILE CHECKSUM: 5085947ac7c4264a9a5a6c2b2fbfda3346c146e7
15 |
16 | COCOAPODS: 1.11.2
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/String+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import Foundation
9 |
10 | extension String {
11 |
12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String {
13 |
14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UIColor+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 |
12 | convenience init(red: Int, green: Int, blue: Int) {
13 |
14 | self.init(red: CGFloat(red)/255.0,
15 | green: CGFloat(green)/255.0,
16 | blue: CGFloat(blue)/255.0,
17 | alpha: 1)
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UITableViewCell+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewCell+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UITableViewCell {
11 |
12 | class func classIdentifier() -> String {
13 | guard let className = String(describing: self).components(separatedBy: ".").last else {
14 | return ""
15 | }
16 |
17 | return className
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+Extensions.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 06/10/21.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIViewController {
11 |
12 | func insideNavigationController() -> UINavigationController {
13 |
14 | let navigationController = UINavigationController(rootViewController: self)
15 | navigationController.modalPresentationStyle = .formSheet
16 |
17 | return navigationController
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Models/Repository.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repository.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 14/01/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Repository {
11 | let name: String
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Detail/DetailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Detail/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class DetailViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = DetailView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Settings/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 07/01/22.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsView: UIView {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Settings/SettingsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsViewController.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 03/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | class SettingsViewController: UIViewController {
11 |
12 | override func loadView() {
13 | self.view = SettingsView()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/solutions/devsprint-rodrigo-borges-2/GitHubApp/Service/Service.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Service.swift
3 | // GitHubApp
4 | //
5 | // Created by Rodrigo Borges on 30/09/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Service {
11 |
12 | func fetchList(_ completion: ([String]) -> Void) {
13 |
14 | completion(["Repository 1", "Repository 2", "Repository 3"])
15 | }
16 | }
17 |
--------------------------------------------------------------------------------