diff --git a/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.pbxproj b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.pbxproj new file mode 100644 index 00000000..f251707a --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.pbxproj @@ -0,0 +1,966 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 910A7A0329C30A6100B7CC00 /* TMDBTrendingShowListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0229C30A6100B7CC00 /* TMDBTrendingShowListRepository.swift */; }; + 910A7A0529C30ABA00B7CC00 /* TMDBPopularDocumentaryListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0429C30ABA00B7CC00 /* TMDBPopularDocumentaryListRepository.swift */; }; + 910A7A0829C30B8000B7CC00 /* TrendingShowListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0729C30B8000B7CC00 /* TrendingShowListRepository.swift */; }; + 910A7A0A29C30BB300B7CC00 /* PopularDocumentaryListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0929C30BB300B7CC00 /* PopularDocumentaryListRepository.swift */; }; + 910A7A0C29C30D1F00B7CC00 /* TrendingMovieListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0B29C30D1F00B7CC00 /* TrendingMovieListUseCase.swift */; }; + 910A7A0E29C30D4A00B7CC00 /* DefaultTrendingMovieListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0D29C30D4A00B7CC00 /* DefaultTrendingMovieListUseCase.swift */; }; + 910A7A1029C30DDB00B7CC00 /* PopularDocumentaryListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A0F29C30DDB00B7CC00 /* PopularDocumentaryListUseCase.swift */; }; + 910A7A1229C30E0B00B7CC00 /* DefaultPopularDocumentaryListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A1129C30E0B00B7CC00 /* DefaultPopularDocumentaryListUseCase.swift */; }; + 910A7A1429C30E7A00B7CC00 /* DashboardFacade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910A7A1329C30E7A00B7CC00 /* DashboardFacade.swift */; }; + 9133479F299FC5CB00F2ECF4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9133479E299FC5CB00F2ECF4 /* Assets.xcassets */; }; + 913347A2299FC5CB00F2ECF4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 913347A1299FC5CB00F2ECF4 /* Preview Assets.xcassets */; }; + 9140380329C1DECD0096C5CD /* AmazonFavorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9140380229C1DECD0096C5CD /* AmazonFavorite.swift */; }; + 9140380529C1E2570096C5CD /* AmazonFavoriteEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9140380429C1E2570096C5CD /* AmazonFavoriteEndpoint.swift */; }; + 9140380729C1E3EC0096C5CD /* AmazonFavoriteTrainingDELETERepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9140380629C1E3EC0096C5CD /* AmazonFavoriteTrainingDELETERepository.swift */; }; + 917E655329C127B100C1490B /* FavoriteTrainingPOSTRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917E655229C127B100C1490B /* FavoriteTrainingPOSTRepository.swift */; }; + 91B0899E29C10E6C00E680E4 /* ApplicationEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B0899C29C10E6C00E680E4 /* ApplicationEnvironment.swift */; }; + 91B0899F29C10E6C00E680E4 /* GlobantPlusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B0899D29C10E6C00E680E4 /* GlobantPlusApp.swift */; }; + 91B089B629C10EF300E680E4 /* DefaultShowViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089A629C10EF300E680E4 /* DefaultShowViewModel.swift */; }; + 91B089B729C10EF300E680E4 /* ShowViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089A729C10EF300E680E4 /* ShowViewModel.swift */; }; + 91B089B829C10EF300E680E4 /* ShowView+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089A929C10EF300E680E4 /* ShowView+Model.swift */; }; + 91B089B929C10EF300E680E4 /* ShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089AB29C10EF300E680E4 /* ShowView.swift */; }; + 91B089BA29C10EF300E680E4 /* DashboardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089AE29C10EF300E680E4 /* DashboardViewModel.swift */; }; + 91B089BB29C10EF300E680E4 /* DefaultDashboardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089AF29C10EF300E680E4 /* DefaultDashboardViewModel.swift */; }; + 91B089BD29C10EF300E680E4 /* DashboardView+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089B329C10EF300E680E4 /* DashboardView+Model.swift */; }; + 91B089BE29C10EF300E680E4 /* DashboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089B529C10EF300E680E4 /* DashboardView.swift */; }; + 91B089D529C10F1400E680E4 /* FetchFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C129C10F1400E680E4 /* FetchFavoriteRepository.swift */; }; + 91B089D629C10F1400E680E4 /* InsertFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C229C10F1400E680E4 /* InsertFavoriteRepository.swift */; }; + 91B089D729C10F1400E680E4 /* DeleteFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C329C10F1400E680E4 /* DeleteFavoriteRepository.swift */; }; + 91B089D829C10F1400E680E4 /* ShowRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C429C10F1400E680E4 /* ShowRepository.swift */; }; + 91B089D929C10F1400E680E4 /* TrendingMovieListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C529C10F1400E680E4 /* TrendingMovieListRepository.swift */; }; + 91B089DA29C10F1400E680E4 /* DefaultFavoriteUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C829C10F1400E680E4 /* DefaultFavoriteUseCase.swift */; }; + 91B089DB29C10F1400E680E4 /* FavoriteUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089C929C10F1400E680E4 /* FavoriteUseCase.swift */; }; + 91B089DC29C10F1400E680E4 /* DefaultShowUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089CB29C10F1400E680E4 /* DefaultShowUseCase.swift */; }; + 91B089DD29C10F1400E680E4 /* ShowUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089CC29C10F1400E680E4 /* ShowUseCase.swift */; }; + 91B089DE29C10F1400E680E4 /* DefaultTrendingShowListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089CE29C10F1400E680E4 /* DefaultTrendingShowListUseCase.swift */; }; + 91B089DF29C10F1400E680E4 /* TrendingShowListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089CF29C10F1400E680E4 /* TrendingShowListUseCase.swift */; }; + 91B089E029C10F1400E680E4 /* TrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089D129C10F1400E680E4 /* TrendingItem.swift */; }; + 91B089E129C10F1400E680E4 /* Genre.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089D229C10F1400E680E4 /* Genre.swift */; }; + 91B089E229C10F1400E680E4 /* Show.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089D329C10F1400E680E4 /* Show.swift */; }; + 91B089E329C10F1400E680E4 /* GlobantPlusError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089D429C10F1400E680E4 /* GlobantPlusError.swift */; }; + 91B089FE29C10F2200E680E4 /* Int+Runtime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089E529C10F2200E680E4 /* Int+Runtime.swift */; }; + 91B089FF29C10F2200E680E4 /* CoreDataInsertFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089E829C10F2200E680E4 /* CoreDataInsertFavoriteRepository.swift */; }; + 91B08A0029C10F2200E680E4 /* CoreDataDeleteFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089E929C10F2200E680E4 /* CoreDataDeleteFavoriteRepository.swift */; }; + 91B08A0129C10F2200E680E4 /* CoreDataFetchFavoriteRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089EA29C10F2200E680E4 /* CoreDataFetchFavoriteRepository.swift */; }; + 91B08A0229C10F2200E680E4 /* TMDBShowRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089EC29C10F2200E680E4 /* TMDBShowRepository.swift */; }; + 91B08A0329C10F2200E680E4 /* TMDBTrendingMovieListRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089EE29C10F2200E680E4 /* TMDBTrendingMovieListRepository.swift */; }; + 91B08A0429C10F2200E680E4 /* SQSActivityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089F129C10F2200E680E4 /* SQSActivityQueue.swift */; }; + 91B08A0529C10F2200E680E4 /* Trackable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089F229C10F2200E680E4 /* Trackable.swift */; }; + 91B08A0629C10F2200E680E4 /* SQSActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089F429C10F2200E680E4 /* SQSActivity.swift */; }; + 91B08A0729C10F2200E680E4 /* CoraDataStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089F629C10F2200E680E4 /* CoraDataStorage.swift */; }; + 91B08A0829C10F2200E680E4 /* GlobantPlusCoreData.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 91B089F829C10F2200E680E4 /* GlobantPlusCoreData.xcdatamodeld */; }; + 91B08A0929C10F2200E680E4 /* StorageSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089FA29C10F2200E680E4 /* StorageSettings.swift */; }; + 91B08A0A29C10F2200E680E4 /* PCDFavorite+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089FC29C10F2200E680E4 /* PCDFavorite+CoreDataProperties.swift */; }; + 91B08A0B29C10F2200E680E4 /* PCDFavorite+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B089FD29C10F2200E680E4 /* PCDFavorite+CoreDataClass.swift */; }; + 91BC777729C1DA8B003AC200 /* AmazonFavoriteTrainingPOSTRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91BC777629C1DA8B003AC200 /* AmazonFavoriteTrainingPOSTRepository.swift */; }; + 91BC777929C1DB14003AC200 /* FavoriteTrainingDELETERepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91BC777829C1DB14003AC200 /* FavoriteTrainingDELETERepository.swift */; }; + 91BC777F29C1DD78003AC200 /* Resty in Frameworks */ = {isa = PBXBuildFile; productRef = 91BC777E29C1DD78003AC200 /* Resty */; }; + 91BC778029C1DD78003AC200 /* Resty in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 91BC777E29C1DD78003AC200 /* Resty */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 91BC778329C1DDB7003AC200 /* SotoSQS in Frameworks */ = {isa = PBXBuildFile; productRef = 91BC778229C1DDB7003AC200 /* SotoSQS */; }; + 91BCE63529C117E3006779B3 /* MovieDB in Frameworks */ = {isa = PBXBuildFile; productRef = 91BCE63429C117E3006779B3 /* MovieDB */; }; + 91BCE63629C117E3006779B3 /* MovieDB in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 91BCE63429C117E3006779B3 /* MovieDB */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 91BCE63929C11BCB006779B3 /* GlobantPlusUI in Frameworks */ = {isa = PBXBuildFile; productRef = 91BCE63829C11BCB006779B3 /* GlobantPlusUI */; }; + 91BCE63A29C11BCB006779B3 /* GlobantPlusUI in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 91BCE63829C11BCB006779B3 /* GlobantPlusUI */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + D8B278DE29C22445008EFD74 /* AppConfig.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */; }; + D8B278E029C22A3F008EFD74 /* AmazonFavoriteTrainingBaseRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B278DF29C22A3F008EFD74 /* AmazonFavoriteTrainingBaseRepository.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 91BCE63729C117E3006779B3 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 91BC778029C1DD78003AC200 /* Resty in Embed Frameworks */, + 91BCE63A29C11BCB006779B3 /* GlobantPlusUI in Embed Frameworks */, + 91BCE63629C117E3006779B3 /* MovieDB in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 910A7A0229C30A6100B7CC00 /* TMDBTrendingShowListRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TMDBTrendingShowListRepository.swift; sourceTree = ""; }; + 910A7A0429C30ABA00B7CC00 /* TMDBPopularDocumentaryListRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TMDBPopularDocumentaryListRepository.swift; sourceTree = ""; }; + 910A7A0729C30B8000B7CC00 /* TrendingShowListRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendingShowListRepository.swift; sourceTree = ""; }; + 910A7A0929C30BB300B7CC00 /* PopularDocumentaryListRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularDocumentaryListRepository.swift; sourceTree = ""; }; + 910A7A0B29C30D1F00B7CC00 /* TrendingMovieListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendingMovieListUseCase.swift; sourceTree = ""; }; + 910A7A0D29C30D4A00B7CC00 /* DefaultTrendingMovieListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultTrendingMovieListUseCase.swift; sourceTree = ""; }; + 910A7A0F29C30DDB00B7CC00 /* PopularDocumentaryListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularDocumentaryListUseCase.swift; sourceTree = ""; }; + 910A7A1129C30E0B00B7CC00 /* DefaultPopularDocumentaryListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPopularDocumentaryListUseCase.swift; sourceTree = ""; }; + 910A7A1329C30E7A00B7CC00 /* DashboardFacade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardFacade.swift; sourceTree = ""; }; + 91334797299FC5CA00F2ECF4 /* GlobantPlus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GlobantPlus.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9133479E299FC5CB00F2ECF4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 913347A1299FC5CB00F2ECF4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 913EAA4E29C116FD004937BE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 9140380229C1DECD0096C5CD /* AmazonFavorite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmazonFavorite.swift; sourceTree = ""; }; + 9140380429C1E2570096C5CD /* AmazonFavoriteEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmazonFavoriteEndpoint.swift; sourceTree = ""; }; + 9140380629C1E3EC0096C5CD /* AmazonFavoriteTrainingDELETERepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmazonFavoriteTrainingDELETERepository.swift; sourceTree = ""; }; + 917E655229C127B100C1490B /* FavoriteTrainingPOSTRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteTrainingPOSTRepository.swift; sourceTree = ""; }; + 91B0899C29C10E6C00E680E4 /* ApplicationEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationEnvironment.swift; sourceTree = ""; }; + 91B0899D29C10E6C00E680E4 /* GlobantPlusApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobantPlusApp.swift; sourceTree = ""; }; + 91B089A629C10EF300E680E4 /* DefaultShowViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultShowViewModel.swift; sourceTree = ""; }; + 91B089A729C10EF300E680E4 /* ShowViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowViewModel.swift; sourceTree = ""; }; + 91B089A929C10EF300E680E4 /* ShowView+Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ShowView+Model.swift"; sourceTree = ""; }; + 91B089AB29C10EF300E680E4 /* ShowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowView.swift; sourceTree = ""; }; + 91B089AE29C10EF300E680E4 /* DashboardViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DashboardViewModel.swift; sourceTree = ""; }; + 91B089AF29C10EF300E680E4 /* DefaultDashboardViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultDashboardViewModel.swift; sourceTree = ""; }; + 91B089B329C10EF300E680E4 /* DashboardView+Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DashboardView+Model.swift"; sourceTree = ""; }; + 91B089B529C10EF300E680E4 /* DashboardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DashboardView.swift; sourceTree = ""; }; + 91B089C129C10F1400E680E4 /* FetchFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchFavoriteRepository.swift; sourceTree = ""; }; + 91B089C229C10F1400E680E4 /* InsertFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsertFavoriteRepository.swift; sourceTree = ""; }; + 91B089C329C10F1400E680E4 /* DeleteFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteFavoriteRepository.swift; sourceTree = ""; }; + 91B089C429C10F1400E680E4 /* ShowRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowRepository.swift; sourceTree = ""; }; + 91B089C529C10F1400E680E4 /* TrendingMovieListRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrendingMovieListRepository.swift; sourceTree = ""; }; + 91B089C829C10F1400E680E4 /* DefaultFavoriteUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultFavoriteUseCase.swift; sourceTree = ""; }; + 91B089C929C10F1400E680E4 /* FavoriteUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FavoriteUseCase.swift; sourceTree = ""; }; + 91B089CB29C10F1400E680E4 /* DefaultShowUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultShowUseCase.swift; sourceTree = ""; }; + 91B089CC29C10F1400E680E4 /* ShowUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowUseCase.swift; sourceTree = ""; }; + 91B089CE29C10F1400E680E4 /* DefaultTrendingShowListUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultTrendingShowListUseCase.swift; sourceTree = ""; }; + 91B089CF29C10F1400E680E4 /* TrendingShowListUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrendingShowListUseCase.swift; sourceTree = ""; }; + 91B089D129C10F1400E680E4 /* TrendingItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrendingItem.swift; sourceTree = ""; }; + 91B089D229C10F1400E680E4 /* Genre.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Genre.swift; sourceTree = ""; }; + 91B089D329C10F1400E680E4 /* Show.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Show.swift; sourceTree = ""; }; + 91B089D429C10F1400E680E4 /* GlobantPlusError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobantPlusError.swift; sourceTree = ""; }; + 91B089E529C10F2200E680E4 /* Int+Runtime.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Int+Runtime.swift"; sourceTree = ""; }; + 91B089E829C10F2200E680E4 /* CoreDataInsertFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataInsertFavoriteRepository.swift; sourceTree = ""; }; + 91B089E929C10F2200E680E4 /* CoreDataDeleteFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataDeleteFavoriteRepository.swift; sourceTree = ""; }; + 91B089EA29C10F2200E680E4 /* CoreDataFetchFavoriteRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataFetchFavoriteRepository.swift; sourceTree = ""; }; + 91B089EC29C10F2200E680E4 /* TMDBShowRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TMDBShowRepository.swift; sourceTree = ""; }; + 91B089EE29C10F2200E680E4 /* TMDBTrendingMovieListRepository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TMDBTrendingMovieListRepository.swift; sourceTree = ""; }; + 91B089F129C10F2200E680E4 /* SQSActivityQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQSActivityQueue.swift; sourceTree = ""; }; + 91B089F229C10F2200E680E4 /* Trackable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Trackable.swift; sourceTree = ""; }; + 91B089F429C10F2200E680E4 /* SQSActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQSActivity.swift; sourceTree = ""; }; + 91B089F629C10F2200E680E4 /* CoraDataStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoraDataStorage.swift; sourceTree = ""; }; + 91B089F929C10F2200E680E4 /* PremireCoreData.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = PremireCoreData.xcdatamodel; sourceTree = ""; }; + 91B089FA29C10F2200E680E4 /* StorageSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageSettings.swift; sourceTree = ""; }; + 91B089FC29C10F2200E680E4 /* PCDFavorite+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PCDFavorite+CoreDataProperties.swift"; sourceTree = ""; }; + 91B089FD29C10F2200E680E4 /* PCDFavorite+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PCDFavorite+CoreDataClass.swift"; sourceTree = ""; }; + 91B08A0C29C1100F00E680E4 /* GlobantPlusUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = GlobantPlusUI; sourceTree = ""; }; + 91B08A0D29C1103000E680E4 /* MovieDB */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = MovieDB; sourceTree = ""; }; + 91BC777529C1B4A2003AC200 /* Resty */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Resty; sourceTree = ""; }; + 91BC777629C1DA8B003AC200 /* AmazonFavoriteTrainingPOSTRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmazonFavoriteTrainingPOSTRepository.swift; sourceTree = ""; }; + 91BC777829C1DB14003AC200 /* FavoriteTrainingDELETERepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteTrainingDELETERepository.swift; sourceTree = ""; }; + D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = AppConfig.xcconfig; sourceTree = ""; }; + D8B278DF29C22A3F008EFD74 /* AmazonFavoriteTrainingBaseRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmazonFavoriteTrainingBaseRepository.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 91334794299FC5CA00F2ECF4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 91BC777F29C1DD78003AC200 /* Resty in Frameworks */, + 91BCE63529C117E3006779B3 /* MovieDB in Frameworks */, + 91BCE63929C11BCB006779B3 /* GlobantPlusUI in Frameworks */, + 91BC778329C1DDB7003AC200 /* SotoSQS in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 910A7A0629C30B6000B7CC00 /* Dashboard */ = { + isa = PBXGroup; + children = ( + 91B089C529C10F1400E680E4 /* TrendingMovieListRepository.swift */, + 910A7A0729C30B8000B7CC00 /* TrendingShowListRepository.swift */, + 910A7A0929C30BB300B7CC00 /* PopularDocumentaryListRepository.swift */, + ); + path = Dashboard; + sourceTree = ""; + }; + 9133478E299FC5CA00F2ECF4 = { + isa = PBXGroup; + children = ( + 91BC777529C1B4A2003AC200 /* Resty */, + 91B08A0D29C1103000E680E4 /* MovieDB */, + 91B08A0C29C1100F00E680E4 /* GlobantPlusUI */, + 91334799299FC5CA00F2ECF4 /* GlobantPlus */, + 91334798299FC5CA00F2ECF4 /* Products */, + 91BCE63029C117E3006779B3 /* Frameworks */, + ); + sourceTree = ""; + }; + 91334798299FC5CA00F2ECF4 /* Products */ = { + isa = PBXGroup; + children = ( + 91334797299FC5CA00F2ECF4 /* GlobantPlus.app */, + ); + name = Products; + sourceTree = ""; + }; + 91334799299FC5CA00F2ECF4 /* GlobantPlus */ = { + isa = PBXGroup; + children = ( + 913EAA4E29C116FD004937BE /* Info.plist */, + 913347AB299FC5F300F2ECF4 /* Application */, + 913347AA299FC5E600F2ECF4 /* Presentation */, + 913347A9299FC5E000F2ECF4 /* Domain */, + 913347A8299FC5DA00F2ECF4 /* Data */, + 913347A0299FC5CB00F2ECF4 /* Preview Content */, + ); + path = GlobantPlus; + sourceTree = ""; + }; + 913347A0299FC5CB00F2ECF4 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 913347A1299FC5CB00F2ECF4 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 913347A8299FC5DA00F2ECF4 /* Data */ = { + isa = PBXGroup; + children = ( + 917E655029C1274B00C1490B /* Network */, + 91B089E429C10F2200E680E4 /* Extensions */, + 91B089EF29C10F2200E680E4 /* Queues */, + 91B089E629C10F2200E680E4 /* Repositories */, + 91B089F529C10F2200E680E4 /* Storage */, + ); + path = Data; + sourceTree = ""; + }; + 913347A9299FC5E000F2ECF4 /* Domain */ = { + isa = PBXGroup; + children = ( + 91B089D029C10F1400E680E4 /* Model */, + 91B089BF29C10F1400E680E4 /* Repositories */, + 91B089C629C10F1400E680E4 /* UseCases */, + ); + path = Domain; + sourceTree = ""; + }; + 913347AA299FC5E600F2ECF4 /* Presentation */ = { + isa = PBXGroup; + children = ( + 913347B5299FC80E00F2ECF4 /* Scenes */, + 913347AC299FC5FB00F2ECF4 /* Resources */, + ); + path = Presentation; + sourceTree = ""; + }; + 913347AB299FC5F300F2ECF4 /* Application */ = { + isa = PBXGroup; + children = ( + D8B278DC29C22445008EFD74 /* Configuration */, + 91B0899C29C10E6C00E680E4 /* ApplicationEnvironment.swift */, + 91B0899D29C10E6C00E680E4 /* GlobantPlusApp.swift */, + ); + path = Application; + sourceTree = ""; + }; + 913347AC299FC5FB00F2ECF4 /* Resources */ = { + isa = PBXGroup; + children = ( + 9133479E299FC5CB00F2ECF4 /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + 913347B5299FC80E00F2ECF4 /* Scenes */ = { + isa = PBXGroup; + children = ( + 91B089AC29C10EF300E680E4 /* Dashboard */, + 91B089A429C10EF300E680E4 /* Show */, + ); + path = Scenes; + sourceTree = ""; + }; + 9140380129C1DEBE0096C5CD /* Model */ = { + isa = PBXGroup; + children = ( + 9140380229C1DECD0096C5CD /* AmazonFavorite.swift */, + 9140380429C1E2570096C5CD /* AmazonFavoriteEndpoint.swift */, + ); + path = Model; + sourceTree = ""; + }; + 917E655029C1274B00C1490B /* Network */ = { + isa = PBXGroup; + children = ( + 917E655129C1276000C1490B /* AmazonAPI */, + ); + path = Network; + sourceTree = ""; + }; + 917E655129C1276000C1490B /* AmazonAPI */ = { + isa = PBXGroup; + children = ( + 9140380129C1DEBE0096C5CD /* Model */, + 91BC777629C1DA8B003AC200 /* AmazonFavoriteTrainingPOSTRepository.swift */, + 9140380629C1E3EC0096C5CD /* AmazonFavoriteTrainingDELETERepository.swift */, + D8B278DF29C22A3F008EFD74 /* AmazonFavoriteTrainingBaseRepository.swift */, + ); + path = AmazonAPI; + sourceTree = ""; + }; + 91B089A429C10EF300E680E4 /* Show */ = { + isa = PBXGroup; + children = ( + 91B089A529C10EF300E680E4 /* ViewModel */, + 91B089A829C10EF300E680E4 /* Model */, + 91B089AA29C10EF300E680E4 /* View */, + ); + path = Show; + sourceTree = ""; + }; + 91B089A529C10EF300E680E4 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 91B089A629C10EF300E680E4 /* DefaultShowViewModel.swift */, + 91B089A729C10EF300E680E4 /* ShowViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 91B089A829C10EF300E680E4 /* Model */ = { + isa = PBXGroup; + children = ( + 91B089A929C10EF300E680E4 /* ShowView+Model.swift */, + ); + path = Model; + sourceTree = ""; + }; + 91B089AA29C10EF300E680E4 /* View */ = { + isa = PBXGroup; + children = ( + 91B089AB29C10EF300E680E4 /* ShowView.swift */, + ); + path = View; + sourceTree = ""; + }; + 91B089AC29C10EF300E680E4 /* Dashboard */ = { + isa = PBXGroup; + children = ( + 91B089AD29C10EF300E680E4 /* ViewModel */, + 91B089B229C10EF300E680E4 /* Model */, + 91B089B429C10EF300E680E4 /* View */, + ); + path = Dashboard; + sourceTree = ""; + }; + 91B089AD29C10EF300E680E4 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 91B089AE29C10EF300E680E4 /* DashboardViewModel.swift */, + 91B089AF29C10EF300E680E4 /* DefaultDashboardViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 91B089B229C10EF300E680E4 /* Model */ = { + isa = PBXGroup; + children = ( + 91B089B329C10EF300E680E4 /* DashboardView+Model.swift */, + ); + path = Model; + sourceTree = ""; + }; + 91B089B429C10EF300E680E4 /* View */ = { + isa = PBXGroup; + children = ( + 91B089B529C10EF300E680E4 /* DashboardView.swift */, + ); + path = View; + sourceTree = ""; + }; + 91B089BF29C10F1400E680E4 /* Repositories */ = { + isa = PBXGroup; + children = ( + 910A7A0629C30B6000B7CC00 /* Dashboard */, + 91B089C029C10F1400E680E4 /* Favorires */, + 91B089C429C10F1400E680E4 /* ShowRepository.swift */, + ); + path = Repositories; + sourceTree = ""; + }; + 91B089C029C10F1400E680E4 /* Favorires */ = { + isa = PBXGroup; + children = ( + 91B089C129C10F1400E680E4 /* FetchFavoriteRepository.swift */, + 91B089C229C10F1400E680E4 /* InsertFavoriteRepository.swift */, + 91B089C329C10F1400E680E4 /* DeleteFavoriteRepository.swift */, + 917E655229C127B100C1490B /* FavoriteTrainingPOSTRepository.swift */, + 91BC777829C1DB14003AC200 /* FavoriteTrainingDELETERepository.swift */, + ); + path = Favorires; + sourceTree = ""; + }; + 91B089C629C10F1400E680E4 /* UseCases */ = { + isa = PBXGroup; + children = ( + 91B089C729C10F1400E680E4 /* Favorites */, + 91B089CA29C10F1400E680E4 /* Show */, + 91B089CD29C10F1400E680E4 /* Dashboard */, + ); + path = UseCases; + sourceTree = ""; + }; + 91B089C729C10F1400E680E4 /* Favorites */ = { + isa = PBXGroup; + children = ( + 91B089C829C10F1400E680E4 /* DefaultFavoriteUseCase.swift */, + 91B089C929C10F1400E680E4 /* FavoriteUseCase.swift */, + ); + path = Favorites; + sourceTree = ""; + }; + 91B089CA29C10F1400E680E4 /* Show */ = { + isa = PBXGroup; + children = ( + 91B089CB29C10F1400E680E4 /* DefaultShowUseCase.swift */, + 91B089CC29C10F1400E680E4 /* ShowUseCase.swift */, + ); + path = Show; + sourceTree = ""; + }; + 91B089CD29C10F1400E680E4 /* Dashboard */ = { + isa = PBXGroup; + children = ( + 91B089CE29C10F1400E680E4 /* DefaultTrendingShowListUseCase.swift */, + 91B089CF29C10F1400E680E4 /* TrendingShowListUseCase.swift */, + 910A7A0B29C30D1F00B7CC00 /* TrendingMovieListUseCase.swift */, + 910A7A0D29C30D4A00B7CC00 /* DefaultTrendingMovieListUseCase.swift */, + 910A7A0F29C30DDB00B7CC00 /* PopularDocumentaryListUseCase.swift */, + 910A7A1129C30E0B00B7CC00 /* DefaultPopularDocumentaryListUseCase.swift */, + 910A7A1329C30E7A00B7CC00 /* DashboardFacade.swift */, + ); + path = Dashboard; + sourceTree = ""; + }; + 91B089D029C10F1400E680E4 /* Model */ = { + isa = PBXGroup; + children = ( + 91B089D129C10F1400E680E4 /* TrendingItem.swift */, + 91B089D229C10F1400E680E4 /* Genre.swift */, + 91B089D329C10F1400E680E4 /* Show.swift */, + 91B089D429C10F1400E680E4 /* GlobantPlusError.swift */, + ); + path = Model; + sourceTree = ""; + }; + 91B089E429C10F2200E680E4 /* Extensions */ = { + isa = PBXGroup; + children = ( + 91B089E529C10F2200E680E4 /* Int+Runtime.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 91B089E629C10F2200E680E4 /* Repositories */ = { + isa = PBXGroup; + children = ( + 91B089E729C10F2200E680E4 /* Favorites */, + 91B089EB29C10F2200E680E4 /* Show */, + 91B089ED29C10F2200E680E4 /* Dashboard */, + ); + path = Repositories; + sourceTree = ""; + }; + 91B089E729C10F2200E680E4 /* Favorites */ = { + isa = PBXGroup; + children = ( + 91B089E829C10F2200E680E4 /* CoreDataInsertFavoriteRepository.swift */, + 91B089E929C10F2200E680E4 /* CoreDataDeleteFavoriteRepository.swift */, + 91B089EA29C10F2200E680E4 /* CoreDataFetchFavoriteRepository.swift */, + ); + path = Favorites; + sourceTree = ""; + }; + 91B089EB29C10F2200E680E4 /* Show */ = { + isa = PBXGroup; + children = ( + 91B089EC29C10F2200E680E4 /* TMDBShowRepository.swift */, + ); + path = Show; + sourceTree = ""; + }; + 91B089ED29C10F2200E680E4 /* Dashboard */ = { + isa = PBXGroup; + children = ( + 91B089EE29C10F2200E680E4 /* TMDBTrendingMovieListRepository.swift */, + 910A7A0229C30A6100B7CC00 /* TMDBTrendingShowListRepository.swift */, + 910A7A0429C30ABA00B7CC00 /* TMDBPopularDocumentaryListRepository.swift */, + ); + path = Dashboard; + sourceTree = ""; + }; + 91B089EF29C10F2200E680E4 /* Queues */ = { + isa = PBXGroup; + children = ( + 91B089F029C10F2200E680E4 /* AmazonSQS */, + ); + path = Queues; + sourceTree = ""; + }; + 91B089F029C10F2200E680E4 /* AmazonSQS */ = { + isa = PBXGroup; + children = ( + 91B089F129C10F2200E680E4 /* SQSActivityQueue.swift */, + 91B089F229C10F2200E680E4 /* Trackable.swift */, + 91B089F329C10F2200E680E4 /* Model */, + ); + path = AmazonSQS; + sourceTree = ""; + }; + 91B089F329C10F2200E680E4 /* Model */ = { + isa = PBXGroup; + children = ( + 91B089F429C10F2200E680E4 /* SQSActivity.swift */, + ); + path = Model; + sourceTree = ""; + }; + 91B089F529C10F2200E680E4 /* Storage */ = { + isa = PBXGroup; + children = ( + 91B089F629C10F2200E680E4 /* CoraDataStorage.swift */, + 91B089F729C10F2200E680E4 /* Model */, + 91B089FA29C10F2200E680E4 /* StorageSettings.swift */, + 91B089FB29C10F2200E680E4 /* Entities */, + ); + path = Storage; + sourceTree = ""; + }; + 91B089F729C10F2200E680E4 /* Model */ = { + isa = PBXGroup; + children = ( + 91B089F829C10F2200E680E4 /* GlobantPlusCoreData.xcdatamodeld */, + ); + path = Model; + sourceTree = ""; + }; + 91B089FB29C10F2200E680E4 /* Entities */ = { + isa = PBXGroup; + children = ( + 91B089FC29C10F2200E680E4 /* PCDFavorite+CoreDataProperties.swift */, + 91B089FD29C10F2200E680E4 /* PCDFavorite+CoreDataClass.swift */, + ); + path = Entities; + sourceTree = ""; + }; + 91BCE63029C117E3006779B3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + D8B278DC29C22445008EFD74 /* Configuration */ = { + isa = PBXGroup; + children = ( + D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */, + ); + path = Configuration; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 91334796299FC5CA00F2ECF4 /* GlobantPlus */ = { + isa = PBXNativeTarget; + buildConfigurationList = 913347A5299FC5CB00F2ECF4 /* Build configuration list for PBXNativeTarget "GlobantPlus" */; + buildPhases = ( + 91334793299FC5CA00F2ECF4 /* Sources */, + 91334794299FC5CA00F2ECF4 /* Frameworks */, + 91334795299FC5CA00F2ECF4 /* Resources */, + 91BCE63729C117E3006779B3 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GlobantPlus; + packageProductDependencies = ( + 91BCE63429C117E3006779B3 /* MovieDB */, + 91BCE63829C11BCB006779B3 /* GlobantPlusUI */, + 91BC777E29C1DD78003AC200 /* Resty */, + 91BC778229C1DDB7003AC200 /* SotoSQS */, + ); + productName = GlobantPlus; + productReference = 91334797299FC5CA00F2ECF4 /* GlobantPlus.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9133478F299FC5CA00F2ECF4 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1420; + LastUpgradeCheck = 1420; + TargetAttributes = { + 91334796299FC5CA00F2ECF4 = { + CreatedOnToolsVersion = 14.2; + LastSwiftMigration = 1420; + }; + }; + }; + buildConfigurationList = 91334792299FC5CA00F2ECF4 /* Build configuration list for PBXProject "GlobantPlus" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 9133478E299FC5CA00F2ECF4; + packageReferences = ( + 91BC778129C1DDB7003AC200 /* XCRemoteSwiftPackageReference "soto" */, + ); + productRefGroup = 91334798299FC5CA00F2ECF4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 91334796299FC5CA00F2ECF4 /* GlobantPlus */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 91334795299FC5CA00F2ECF4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 913347A2299FC5CB00F2ECF4 /* Preview Assets.xcassets in Resources */, + D8B278DE29C22445008EFD74 /* AppConfig.xcconfig in Resources */, + 9133479F299FC5CB00F2ECF4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 91334793299FC5CA00F2ECF4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 91B089D729C10F1400E680E4 /* DeleteFavoriteRepository.swift in Sources */, + 910A7A0A29C30BB300B7CC00 /* PopularDocumentaryListRepository.swift in Sources */, + 91B08A0429C10F2200E680E4 /* SQSActivityQueue.swift in Sources */, + 91B0899F29C10E6C00E680E4 /* GlobantPlusApp.swift in Sources */, + 91B08A0529C10F2200E680E4 /* Trackable.swift in Sources */, + 91B08A0729C10F2200E680E4 /* CoraDataStorage.swift in Sources */, + 91B089B629C10EF300E680E4 /* DefaultShowViewModel.swift in Sources */, + 91B089D529C10F1400E680E4 /* FetchFavoriteRepository.swift in Sources */, + 91B089DF29C10F1400E680E4 /* TrendingShowListUseCase.swift in Sources */, + 91B0899E29C10E6C00E680E4 /* ApplicationEnvironment.swift in Sources */, + 91B08A0029C10F2200E680E4 /* CoreDataDeleteFavoriteRepository.swift in Sources */, + 910A7A1229C30E0B00B7CC00 /* DefaultPopularDocumentaryListUseCase.swift in Sources */, + 91B08A0329C10F2200E680E4 /* TMDBTrendingMovieListRepository.swift in Sources */, + 910A7A0829C30B8000B7CC00 /* TrendingShowListRepository.swift in Sources */, + 910A7A0E29C30D4A00B7CC00 /* DefaultTrendingMovieListUseCase.swift in Sources */, + 91B089FE29C10F2200E680E4 /* Int+Runtime.swift in Sources */, + 91B089BD29C10EF300E680E4 /* DashboardView+Model.swift in Sources */, + 91B08A0129C10F2200E680E4 /* CoreDataFetchFavoriteRepository.swift in Sources */, + 91B089BB29C10EF300E680E4 /* DefaultDashboardViewModel.swift in Sources */, + 91B08A0A29C10F2200E680E4 /* PCDFavorite+CoreDataProperties.swift in Sources */, + 91B089DB29C10F1400E680E4 /* FavoriteUseCase.swift in Sources */, + 91B089B729C10EF300E680E4 /* ShowViewModel.swift in Sources */, + 91BC777729C1DA8B003AC200 /* AmazonFavoriteTrainingPOSTRepository.swift in Sources */, + 91B08A0629C10F2200E680E4 /* SQSActivity.swift in Sources */, + 91B08A0229C10F2200E680E4 /* TMDBShowRepository.swift in Sources */, + 91B08A0829C10F2200E680E4 /* GlobantPlusCoreData.xcdatamodeld in Sources */, + D8B278E029C22A3F008EFD74 /* AmazonFavoriteTrainingBaseRepository.swift in Sources */, + 91B089BE29C10EF300E680E4 /* DashboardView.swift in Sources */, + 9140380729C1E3EC0096C5CD /* AmazonFavoriteTrainingDELETERepository.swift in Sources */, + 91B089D629C10F1400E680E4 /* InsertFavoriteRepository.swift in Sources */, + 91B089B829C10EF300E680E4 /* ShowView+Model.swift in Sources */, + 91B089B929C10EF300E680E4 /* ShowView.swift in Sources */, + 91B089D929C10F1400E680E4 /* TrendingMovieListRepository.swift in Sources */, + 91B089E129C10F1400E680E4 /* Genre.swift in Sources */, + 91B089DE29C10F1400E680E4 /* DefaultTrendingShowListUseCase.swift in Sources */, + 917E655329C127B100C1490B /* FavoriteTrainingPOSTRepository.swift in Sources */, + 91B089DA29C10F1400E680E4 /* DefaultFavoriteUseCase.swift in Sources */, + 91B08A0B29C10F2200E680E4 /* PCDFavorite+CoreDataClass.swift in Sources */, + 910A7A1029C30DDB00B7CC00 /* PopularDocumentaryListUseCase.swift in Sources */, + 91B089E229C10F1400E680E4 /* Show.swift in Sources */, + 91B089DC29C10F1400E680E4 /* DefaultShowUseCase.swift in Sources */, + 91B08A0929C10F2200E680E4 /* StorageSettings.swift in Sources */, + 91B089FF29C10F2200E680E4 /* CoreDataInsertFavoriteRepository.swift in Sources */, + 910A7A0529C30ABA00B7CC00 /* TMDBPopularDocumentaryListRepository.swift in Sources */, + 91B089D829C10F1400E680E4 /* ShowRepository.swift in Sources */, + 910A7A0329C30A6100B7CC00 /* TMDBTrendingShowListRepository.swift in Sources */, + 910A7A1429C30E7A00B7CC00 /* DashboardFacade.swift in Sources */, + 9140380329C1DECD0096C5CD /* AmazonFavorite.swift in Sources */, + 9140380529C1E2570096C5CD /* AmazonFavoriteEndpoint.swift in Sources */, + 91B089E029C10F1400E680E4 /* TrendingItem.swift in Sources */, + 91B089DD29C10F1400E680E4 /* ShowUseCase.swift in Sources */, + 91B089BA29C10EF300E680E4 /* DashboardViewModel.swift in Sources */, + 91BC777929C1DB14003AC200 /* FavoriteTrainingDELETERepository.swift in Sources */, + 91B089E329C10F1400E680E4 /* GlobantPlusError.swift in Sources */, + 910A7A0C29C30D1F00B7CC00 /* TrendingMovieListUseCase.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 913347A3299FC5CB00F2ECF4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Application/Info.plist; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = appletvos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TVOS_DEPLOYMENT_TARGET = 16.1; + }; + name = Debug; + }; + 913347A6299FC5CB00F2ECF4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"GlobantPlus/Preview Content\""; + DEVELOPMENT_TEAM = KQUX9WVW3M; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = GlobantPlus/Info.plist; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.desappstre.GlobantPlus; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Debug; + }; + 91B08A0E29C1129400E680E4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Application/Info.plist; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = appletvos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TVOS_DEPLOYMENT_TARGET = 16.1; + }; + name = Release; + }; + 91B08A0F29C1129400E680E4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8B278DD29C22445008EFD74 /* AppConfig.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"GlobantPlus/Preview Content\""; + DEVELOPMENT_TEAM = KQUX9WVW3M; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = GlobantPlus/Info.plist; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.desappstre.GlobantPlus; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 91334792299FC5CA00F2ECF4 /* Build configuration list for PBXProject "GlobantPlus" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 913347A3299FC5CB00F2ECF4 /* Debug */, + 91B08A0E29C1129400E680E4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 913347A5299FC5CB00F2ECF4 /* Build configuration list for PBXNativeTarget "GlobantPlus" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 913347A6299FC5CB00F2ECF4 /* Debug */, + 91B08A0F29C1129400E680E4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 91BC778129C1DDB7003AC200 /* XCRemoteSwiftPackageReference "soto" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/soto-project/soto.git"; + requirement = { + kind = exactVersion; + version = 6.5.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 91BC777E29C1DD78003AC200 /* Resty */ = { + isa = XCSwiftPackageProductDependency; + productName = Resty; + }; + 91BC778229C1DDB7003AC200 /* SotoSQS */ = { + isa = XCSwiftPackageProductDependency; + package = 91BC778129C1DDB7003AC200 /* XCRemoteSwiftPackageReference "soto" */; + productName = SotoSQS; + }; + 91BCE63429C117E3006779B3 /* MovieDB */ = { + isa = XCSwiftPackageProductDependency; + productName = MovieDB; + }; + 91BCE63829C11BCB006779B3 /* GlobantPlusUI */ = { + isa = XCSwiftPackageProductDependency; + productName = GlobantPlusUI; + }; +/* End XCSwiftPackageProductDependency section */ + +/* Begin XCVersionGroup section */ + 91B089F829C10F2200E680E4 /* GlobantPlusCoreData.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 91B089F929C10F2200E680E4 /* PremireCoreData.xcdatamodel */, + ); + currentVersion = 91B089F929C10F2200E680E4 /* PremireCoreData.xcdatamodel */; + path = GlobantPlusCoreData.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 9133478F299FC5CA00F2ECF4 /* Project object */; +} diff --git a/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/xcshareddata/xcschemes/GlobantPlus.xcscheme b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/xcshareddata/xcschemes/GlobantPlus.xcscheme new file mode 100644 index 00000000..729f4286 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus.xcodeproj/xcshareddata/xcschemes/GlobantPlus.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/GlobantPlus/App/GlobantPlus/Application/ApplicationEnvironment.swift b/Examples/GlobantPlus/App/GlobantPlus/Application/ApplicationEnvironment.swift new file mode 100644 index 00000000..47f0bf25 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Application/ApplicationEnvironment.swift @@ -0,0 +1,89 @@ +// +// Environment.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +final class ApplicationEnvironment { + enum Keys: String { + case apiURL = "API_KEY" + case apiToken = "API_AUTH_KEY" + case awsAccessKey = "AWS_ACCESS_KEY_ID" + case awsSecretAccessKey = "AWS_SECRET_ACCESS_KEY" + case awsSQSQueueURL = "SQS_QUEUE_URL" + case awsAPIGatewayURL = "API_GATEWAY_URL" + } + + static let shared = ApplicationEnvironment() + + let dictionary: [String : Any]? + + private init() { + self.dictionary = Bundle.main.infoDictionary + } +} + +extension ApplicationEnvironment { + var apiKey: String { + guard let dictionary = self.dictionary, + let value = dictionary[Keys.apiURL.rawValue] as? String + else { + fatalError("Non value for API_KEY key") + } + + return value + } + + var apiToken: String { + guard let dictionary = self.dictionary, + let token = dictionary[Keys.apiToken.rawValue] as? String + else { + fatalError("Non value for API_AUTH_KEY key") + } + + return token + } + + var awsAccessKey: String { + guard let dictionary = self.dictionary, + let token = dictionary[Keys.awsAccessKey.rawValue] as? String + else { + fatalError("Non value for MY_AWS_ACCESS_KEY_ID key") + } + + return token + } + + var awsSecretAccessKey: String { + guard let dictionary = self.dictionary, + let token = dictionary[Keys.awsSecretAccessKey.rawValue] as? String + else { + fatalError("Non value for MY_AWS_SECRET_ACCESS_KEY key") + } + + return token + } + + var awsAPIGatewayURL: String { + guard let dictionary = self.dictionary, + let token = dictionary[Keys.awsAPIGatewayURL.rawValue] as? String + else { + fatalError("Non value for API_GATEWAY_URL key") + } + + return token + } + + var awsSQSQueueURL: String { + guard let dictionary = self.dictionary, + let token = dictionary[Keys.awsSQSQueueURL.rawValue] as? String + else { + fatalError("Non value for AWS_SQS_QUEUE_URL key") + } + + return token + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig b/Examples/GlobantPlus/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig new file mode 100644 index 00000000..aea493ef --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig @@ -0,0 +1,18 @@ +// +// AppConfig.xcconfig +// Premiere +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +TMDB_API_KEY = ae18023495231d6c234fd8f8ba1e2eb0 +TMDB_API_AUTH_KEY = eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhZTE4MDIzNDk1MjMxZDZjMjM0ZmQ4ZjhiYTFlMmViMCIsInN1YiI6IjUyNzBlNjRlMTljMjk1MmFjMDAzNWI1MyIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.WFrdV7VnZQAhgFzhc-O9jIvpWEL2-JMxCC6rMhwE4l8 + +AWS_ACCESS_KEY_ID = AKIATDXGUYITWP7KXS4S +AWS_SECRET_ACCESS_KEY = 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 + +AWS_SQS_QUEUE_URL = https:/$()/sqs.us-east-1.amazonaws.com/214158328359/user_activity +AWS_API_GATEWAY_URL = https:/$()/fhlymaqeol.execute-api.us-east-1.amazonaws.com diff --git a/Examples/GlobantPlus/App/GlobantPlus/Application/GlobantPlusApp.swift b/Examples/GlobantPlus/App/GlobantPlus/Application/GlobantPlusApp.swift new file mode 100644 index 00000000..fe9ad4a5 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Application/GlobantPlusApp.swift @@ -0,0 +1,31 @@ +// +// PremiereApp.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import SwiftUI + +@main +struct GlobantPlusApp: App { + var body: some Scene { + WindowGroup { + TabView { + NavigationStack { + DashboardView() + .edgesIgnoringSafeArea([ .horizontal ]) + } + .tabItem { + Image(systemName: "flame") + } + + Text("Search") + .tabItem { + Image(systemName: "magnifyingglass") + } + } + .padding(0) + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Extensions/Int+Runtime.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Extensions/Int+Runtime.swift new file mode 100644 index 00000000..16cfccd2 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Extensions/Int+Runtime.swift @@ -0,0 +1,15 @@ +// +// Int+Runtime.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 10/3/23. +// + +import Foundation + +extension Array where Element == Int { + func average() -> Int { + let amount = self.reduce(0) { $0 + $1 } + return (self.count == 0 ? 0 : amount / self.count) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingBaseRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingBaseRepository.swift new file mode 100644 index 00000000..6eace915 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingBaseRepository.swift @@ -0,0 +1,21 @@ +import Foundation +import Resty + +class AmazonFavoriteTrainingBaseRepository { + func process(mediaID: Int, forUser userID: String, httpMethod verb: NetworkRequest.HttpMethod) async throws { + let resty = Resty() + + let amazonFavorite = AmazonFavorite(media: mediaID, user: userID) + + let favoriteRequest = NetworkRequest( + httpHeaders: [ "Content-Type" : "application/json" ], + body: amazonFavorite.encoded(), + httpMethod: verb) + + let favoriteResponse = try await resty.fetch(endpoint: AmazonFavoriteEndpoint.favorite, withParameters: favoriteRequest) + + if favoriteResponse.httpCodeResponse != 200 { + throw GlobantPlusError.dataSourceFailure + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingRepository.swift new file mode 100644 index 00000000..6a03042c --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/AmazonFavoriteTrainingRepository.swift @@ -0,0 +1,19 @@ +// +// AmazonFavoriteTrainingRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 15/3/23. +// + +import Foundation +import Resty + +final class AmazonFavoriteTrainingRepository: AmazonFavoriteTrainingBaseRepository, FavoriteTrainingRepository { + func post(mediaID: Int, forUser userID: String) async throws { + try await super.process(mediaID: mediaID, forUser: userID, httpMethod: .post) + } + + func delete(mediaID: Int, forUser userID: String) async throws { + try await super.process(mediaID: mediaID, forUser: userID, httpMethod: .delete) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavorite.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavorite.swift new file mode 100644 index 00000000..01d59b0a --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavorite.swift @@ -0,0 +1,28 @@ +// +// AmazonFavorite.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 15/3/23. +// + +import Foundation + +struct AmazonFavorite: Encodable { + let userID: String + let showID: Int + let recordID: String + + init(media: Int, user: String) { + self.userID = user + self.showID = media + self.recordID = "\(user.description)-\(media)" + } + + func encoded() -> Data? { + let jsonEncoder = JSONEncoder() + + let meEncoded = try? jsonEncoder.encode(self) + + return meEncoded + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavoriteEndpoint.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavoriteEndpoint.swift new file mode 100644 index 00000000..39c2d62b --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Network/AmazonAPI/Model/AmazonFavoriteEndpoint.swift @@ -0,0 +1,28 @@ +// +// AmazonFavoriteEndpoint.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 15/3/23. +// + +import Foundation +import Resty + +enum AmazonFavoriteEndpoint { + case favorite +} + +extension AmazonFavoriteEndpoint { + var baseURL: String { + return ApplicationEnvironment.shared.awsAPIGatewayURL + } +} + +extension AmazonFavoriteEndpoint: Endpoint { + var path: String { + switch self { + case .favorite: + return "\(baseURL)/favorites" + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift new file mode 100644 index 00000000..e72dd625 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift @@ -0,0 +1,15 @@ +// +// SQSActivity.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +struct SQSActivity: Codable { + let createdAt: Date + let activity: String + let mediaId: Int + let userId: String +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift new file mode 100644 index 00000000..718af39d --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift @@ -0,0 +1,45 @@ +// +// SQSActivityQueue.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 12/3/23. +// + +import Foundation +import SotoSQS + +final class SQSActivityQueue { + private let sqs: SQS + private let awsClient: AWSClient + + init() { + let awsCredentials = CredentialProviderFactory.static(accessKeyId: ApplicationEnvironment.shared.awsAccessKey, secretAccessKey: ApplicationEnvironment.shared.awsSecretAccessKey) + self.awsClient = AWSClient(credentialProvider: awsCredentials, httpClientProvider: .createNew) + + self.sqs = SQS(client: awsClient) + } + + deinit { + try? awsClient.syncShutdown() + } + + func sendMessageFor(activity: SQSActivity) async { + let jsonEncoder = JSONEncoder() + guard let data = try? jsonEncoder.encode(activity), + let jsonActivity = String(data: data, encoding: .utf8) + else + { + return + } + + let activityMessage = SQS.SendMessageRequest(messageBody: jsonActivity, + queueUrl: ApplicationEnvironment.shared.awsSQSQueueURL) + + do { + let queueResponse = try await sqs.sendMessage(activityMessage) + print("👍 SQS message sent with ID \(queueResponse.messageId ?? "none")") + } catch let error { + print("🚨 SQS error: \(error)") + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift new file mode 100644 index 00000000..ddbb0861 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift @@ -0,0 +1,27 @@ +// +// Trackable.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +protocol Trackable { + func trackUser(_ userID: String, activity: String, relatedToMedia mediaID: Int) +} + +extension Trackable { + func trackUser(_ userID: String, activity: String, relatedToMedia mediaID: Int) { + let record = SQSActivity(createdAt: Date(), + activity: activity, + mediaId: mediaID, + userId: userID) + + let sqs = SQSActivityQueue() + + Task(priority: .background) { + await sqs.sendMessageFor(activity: record) + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift new file mode 100644 index 00000000..369ce1a5 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift @@ -0,0 +1,82 @@ +// +// TMDBPopularDocumentaryListRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation +import MovieDB + +final class TMDBDashboardRepository: DashboardRepository { + let apiClient: MovieDB + + init() { + self.apiClient = MovieDB(token: ApplicationEnvironment.shared.apiToken) + } + + func fetchPopularDocumentaries() async throws -> [TrendingItem] { + let apiDocumentaries = try await apiClient.discoverDocumentaries(sortedBy: .popularity) + + let trendingDocumentaries = apiDocumentaries.map({ apiDocumentary in + var trendingDocumentary = TrendingItem(titled: apiDocumentary.title, ofType: .tv, withIdentifier: apiDocumentary.id) + + trendingDocumentary.backdropPath = apiClient.makeBackdropUriFrom(path: apiDocumentary.backdropPath, ofSize: .regular) + trendingDocumentary.posterPath = apiClient.makePosterUriFrom(path: apiDocumentary.posterPath, ofSize: .regular) + + trendingDocumentary.popularity = apiDocumentary.popularity + trendingDocumentary.voteCount = apiDocumentary.voteCount + trendingDocumentary.voteAverage = apiDocumentary.voteAverage + trendingDocumentary.overview = apiDocumentary.overview + + return trendingDocumentary + }) + + return trendingDocumentaries + } + + func fetchTrendingMovies() async throws -> [TrendingItem] { + let apiMovies = try await apiClient.trendingMovies() + + let trendingMovies = apiMovies.map({ apiMovie in + var trendingMovie = TrendingItem(titled: apiMovie.title, ofType: .movie, withIdentifier: apiMovie.id) + + trendingMovie.backdropPath = apiClient.makeBackdropUriFrom(path: apiMovie.backdropPath, ofSize: .regular) + trendingMovie.posterPath = apiClient.makePosterUriFrom(path: apiMovie.posterPath, ofSize: .regular) + + trendingMovie.popularity = apiMovie.popularity + trendingMovie.voteCount = apiMovie.voteCount + trendingMovie.voteAverage = apiMovie.voteAverage + + trendingMovie.isAdultContent = apiMovie.isAdultContent + trendingMovie.overview = apiMovie.overview + + return trendingMovie + }) + + return trendingMovies + } + + func fetchTrendingShows() async throws -> [TrendingItem] { + async let apiShows = apiClient.trendingShows() + async let tvGenres = apiClient.genres(for: .tv) + + let trendingShows = try await apiShows.map({ apiShow in + var trendingShow = TrendingItem(titled: apiShow.title, ofType: .tv, withIdentifier: apiShow.id) + + trendingShow.backdropPath = apiClient.makeBackdropUriFrom(path: apiShow.backdropPath, ofSize: .regular) + trendingShow.posterPath = apiClient.makePosterUriFrom(path: apiShow.posterPath, ofSize: .regular) + + trendingShow.popularity = apiShow.popularity + trendingShow.voteCount = apiShow.voteCount + trendingShow.voteAverage = apiShow.voteAverage + + trendingShow.isAdultContent = apiShow.isAdultContent + trendingShow.overview = apiShow.overview + + return trendingShow + }) + + return trendingShows + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFavoriteRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFavoriteRepository.swift new file mode 100644 index 00000000..9d2bb57a --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFavoriteRepository.swift @@ -0,0 +1,103 @@ +// +// CoreDataFavoriteRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 11/3/23. +// + +import Foundation +import CoreData + +final class CoreDataFavoriteRepository: FavoriteRepository { + func existFavoriteFor(showID: ShowID) throws -> Bool { + guard let _ = try? self.fetchFavoriteManagedObjectFor(showID: showID) else { + return false + } + + return true + } + + func fetchFavoriteManagedObjectFor(showID: Int) throws -> PCDFavorite { + guard let container = CoreDataStorage.defaults.storeContainer else { + throw GlobantPlusError.dataSourceFailure + } + + let request: NSFetchRequest = PCDFavorite.fetchRequest() + request.predicate = NSPredicate(format: "showId = %@", argumentArray: [ showID ]) + + + guard let favorites = try? container.viewContext.fetch(request), + let favorite = favorites.first + else + { + throw GlobantPlusError.emptyResults + } + + return favorite + } + + func fetchFavoriteList() throws -> [ShowID]{ + guard let container = CoreDataStorage.defaults.storeContainer else { + throw GlobantPlusError.dataSourceFailure + } + + let request: NSFetchRequest = PCDFavorite.fetchRequest() + + let sortID = NSSortDescriptor(key: "showId", ascending: true) + + request.sortDescriptors = [ sortID ] + + guard let favorites = try? container.viewContext.fetch(request) else { + throw GlobantPlusError.emptyResults + } + + let domainFavorites = favorites.compactMap({ Int($0.showId) }) + return domainFavorites + } + + func fetchFavoriteFor(showID: ShowID) throws -> ShowID { + guard let container = CoreDataStorage.defaults.storeContainer else { + throw GlobantPlusError.dataSourceFailure + } + + let request: NSFetchRequest = PCDFavorite.fetchRequest() + request.predicate = NSPredicate(format: "showId = %@", argumentArray: [ showID ]) + + + guard let favorites = try? container.viewContext.fetch(request), + let favorite = favorites.first + else + { + throw GlobantPlusError.emptyResults + } + + return ShowID(favorite.showId) + } + + func insert(showId: Int) { + guard let container = CoreDataStorage.defaults.storeContainer else { + return + } + + let newFavorite = NSEntityDescription.insertNewObject(forEntityName: PCDFavorite.entityName, into: container.viewContext) as! PCDFavorite + newFavorite.showId = Int32(showId) + + CoreDataStorage.defaults.saveContext() + } + + func delete(showId: Int) throws { + guard let container = CoreDataStorage.defaults.storeContainer, + let favorite = try? self.fetchFavoriteManagedObjectFor(showID: showId) + else + { + throw GlobantPlusError.dataSourceFailure + } + + do { + container.viewContext.delete(favorite) + try container.viewContext.save() + } catch { + throw GlobantPlusError.dataSourceFailure + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift new file mode 100644 index 00000000..2f6fbcf7 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift @@ -0,0 +1,41 @@ +// +// TMDBShowRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation +import MovieDB + +final class TMDBShowRepository: ShowRepository { + let apiClient: MovieDB + + init() { + self.apiClient = MovieDB(token: ApplicationEnvironment.shared.apiToken) + } + + func fetchShow(identifiedAs showId: Int) async throws -> Show { + let apiShow = try await apiClient.showDetails(showId: showId) + + var show = Show(titled: apiShow.title, identifiedAs: apiShow.id) + + show.tagline = apiShow.tagline + show.overview = apiShow.overview + show.currentStatus = apiShow.currentStatus + show.backdropPath = apiClient.makeBackdropUriFrom(path: apiShow.backdropPath, ofSize: .large) + show.originCountries = apiShow.originCountries + show.isInProduction = apiShow.isInProduction + + show.episodeCount = apiShow.episodeCount + show.seasonCount = apiShow.seasonCount + show.episodeRuntime = apiShow.episodesRuntime.average() + show.voteAverage = apiShow.voteAverage + + show.genres = apiShow.genres.map { apiGenre in + return Genre(id: apiGenre.id, name: apiGenre.name) + } + + return show + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/CoraDataStorage.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/CoraDataStorage.swift new file mode 100644 index 00000000..a1a0bb2f --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/CoraDataStorage.swift @@ -0,0 +1,92 @@ +// +// DeviceStorage.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 09/09/2022 +// + +import CoreData +import Foundation + +final class CoreDataStorage { + + /// Singleton + static let defaults = CoreDataStorage() + + var storeContainer: NSPersistentCloudKitContainer! + + /// Contexto del contenedor de datos + public var managedObjectContext: NSManagedObjectContext { + return self.storeContainer.viewContext + } + + /// + private lazy var applicationDataPath: URL = { + var url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + url = url.appendingPathComponent(StorageSettings.databaseName) + + return url + }() + + // + // MARK: - Inicializamos + // + + private init() { + self.prepareStack() + } + + // + // MARK: - Core Data stack + // + + private func prepareStack() { + let persistentDescription = NSPersistentStoreDescription(url: self.applicationDataPath) + + persistentDescription.type = NSSQLiteStoreType + persistentDescription.shouldInferMappingModelAutomatically = true + persistentDescription.shouldMigrateStoreAutomatically = true + + let container = NSPersistentCloudKitContainer(name: StorageSettings.modelName) + container.persistentStoreDescriptions = [ persistentDescription ] + + container.loadPersistentStores(completionHandler: { (storeDescription: NSPersistentStoreDescription, error: Error?) -> Void in + if let error = error { + let message = "!!! Problema al cargar los stores de Core Data.\n\(error.localizedDescription), \(String(describing: error._userInfo))" + fatalError(message) + } + }) + + self.storeContainer = container + } + + // + // MARK: - Core Data Operations + // + + func saveContext () { + guard let container = self.storeContainer, container.viewContext.hasChanges else { + return + } + + do { + // Guardamos en Core Data... + try container.viewContext.save() + } catch { + print("err @ CORE DATA CONTEXT saveContext()") + } + } + + /** + + */ + func resetContext() { + guard let container = self.storeContainer else { + return + } + + container.viewContext.performAndWait { + container.viewContext.reset() + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift new file mode 100644 index 00000000..88845e7f --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift @@ -0,0 +1,15 @@ +// +// PCDFavorite+CoreDataClass.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 10/3/23. +// +// + +import Foundation +import CoreData + +@objc(PCDFavorite) +public class PCDFavorite: NSManagedObject { + static let entityName = "PCDFavorite" +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift new file mode 100644 index 00000000..e29a8381 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift @@ -0,0 +1,25 @@ +// +// PCDFavorite+CoreDataProperties.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 10/3/23. +// +// + +import Foundation +import CoreData + + +extension PCDFavorite { + @NSManaged public var showId: Int32 + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + return NSFetchRequest(entityName: "PCDFavorite") + } +} + +extension PCDFavorite : Identifiable { + public var id: Int { + return Int(self.showId) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Model/GlobantPlusCoreData.xcdatamodeld/PremireCoreData.xcdatamodel/contents b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Model/GlobantPlusCoreData.xcdatamodeld/PremireCoreData.xcdatamodel/contents new file mode 100644 index 00000000..a99443f2 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/Model/GlobantPlusCoreData.xcdatamodeld/PremireCoreData.xcdatamodel/contents @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/StorageSettings.swift b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/StorageSettings.swift new file mode 100644 index 00000000..c70c5ae3 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Data/Storage/StorageSettings.swift @@ -0,0 +1,6 @@ +import Foundation + +enum StorageSettings { + static let modelName = "GlobantPlusCoreData" + static let databaseName = "GlobantPlus.sqlite" +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Genre.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Genre.swift new file mode 100644 index 00000000..f0e59133 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Genre.swift @@ -0,0 +1,13 @@ +// +// Genre.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 8/3/23. +// + +import Foundation + +struct Genre: Identifiable { + let id: Int + let name: String +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/GlobantPlusError.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/GlobantPlusError.swift new file mode 100644 index 00000000..ae0c1c4b --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/GlobantPlusError.swift @@ -0,0 +1,13 @@ +// +// PremiereError.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 11/3/23. +// + +import Foundation + +enum GlobantPlusError: Error { + case emptyResults + case dataSourceFailure +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Show.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Show.swift new file mode 100644 index 00000000..769153a6 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/Show.swift @@ -0,0 +1,36 @@ +// +// Show.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +typealias ShowID = Int + +struct Show { + let id: ShowID + let title: String + var tagline = "" + var originCountries = [String]() + var overview = "" + var isInProduction = true + var currentStatus: String? + + var episodeCount = 0 + var seasonCount = 0 + var episodeRuntime = 0 + var voteAverage = 0.0 + + var genres = [Genre]() + + var backdropPath: String? + + var isFavorite = false + + init(titled title: String, identifiedAs id: ShowID) { + self.id = id + self.title = title + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/TrendingItem.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/TrendingItem.swift new file mode 100644 index 00000000..43f95092 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Model/TrendingItem.swift @@ -0,0 +1,42 @@ +// +// TrendingItem.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +struct TrendingItem { + enum Media { + case tv + case movie + } + + var id: Int + var title: String + var tagline = "" + var media: TrendingItem.Media + + var originalTitle = "" + var originalLanguage = "" + var originCountries = [String]() + var overview = "" + + var genres = [String]() + + var isAdultContent = false + + var backdropPath: String? + var posterPath: String? + + var voteAverage = 0.0 + var voteCount = 0 + var popularity = 0.0 + + init(titled title: String, ofType media: Media, withIdentifier id: Int) { + self.id = id + self.title = title + self.media = media + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Dashboard/DashboardRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Dashboard/DashboardRepository.swift new file mode 100644 index 00000000..22475793 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Dashboard/DashboardRepository.swift @@ -0,0 +1,14 @@ +// +// DashboardRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +protocol DashboardRepository { + func fetchTrendingShows() async throws -> [TrendingItem] + func fetchTrendingMovies() async throws -> [TrendingItem] + func fetchPopularDocumentaries() async throws -> [TrendingItem] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteRepository.swift new file mode 100644 index 00000000..8c83a9d7 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteRepository.swift @@ -0,0 +1,19 @@ +// +// DeleteFavoriteRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 11/3/23. +// + +import Foundation + +protocol FavoriteRepository { + func existFavoriteFor(showID: ShowID) throws -> Bool + + func fetchFavoriteList() throws -> [ShowID] + func fetchFavoriteFor(showID: ShowID) throws -> ShowID + + func insert(showId: ShowID) + + func delete(showId: ShowID) throws +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteTrainingRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteTrainingRepository.swift new file mode 100644 index 00000000..8ed38966 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Favorires/FavoriteTrainingRepository.swift @@ -0,0 +1,13 @@ +// +// FavoriteTrainingRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 15/3/23. +// + +import Foundation + +protocol FavoriteTrainingRepository { + func post(mediaID: Int, forUser userID: String) async throws + func delete(mediaID: Int, forUser userID: String) async throws +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Show/ShowRepository.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Show/ShowRepository.swift new file mode 100644 index 00000000..1be6992e --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/Repositories/Show/ShowRepository.swift @@ -0,0 +1,12 @@ +// +// ShowRepository.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +protocol ShowRepository { + func fetchShow(identifiedAs showId: Int) async throws -> Show +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardFacade.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardFacade.swift new file mode 100644 index 00000000..30a7ef30 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardFacade.swift @@ -0,0 +1,32 @@ +// +// DashboardFacade.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +final class DashboardFacade { + private let trendingShowListUseCase: TrendingShowListUseCase + private let trendingMovieListUseCase: TrendingMovieListUseCase + private let popularDocumentaryListUseCase: PopularDocumentaryListUseCase + + init() { + self.trendingShowListUseCase = DefaultTrendingShowListUseCase() + self.trendingMovieListUseCase = DefaultTrendingMovieListUseCase() + self.popularDocumentaryListUseCase = DefaultPopularDocumentaryListUseCase() + } + + func fetchTrendingShows() async throws -> [TrendingItem] { + return try await self.trendingShowListUseCase.fetchTrendingShows() + } + + func fetchTrendingMovies() async throws -> [TrendingItem] { + return try await self.trendingMovieListUseCase.fetchTrendingMovies() + } + + func fetchPopularDocumentaries() async throws -> [TrendingItem] { + return try await self.popularDocumentaryListUseCase.fetchPopularDocumentaries() + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultPopularDocumentaryListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultPopularDocumentaryListUseCase.swift new file mode 100644 index 00000000..77290c1d --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultPopularDocumentaryListUseCase.swift @@ -0,0 +1,16 @@ +// +// DefaultPopularDocumentaryListUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +final class DefaultPopularDocumentaryListUseCase: PopularDocumentaryListUseCase { + let popularDocumentaryListRepository: DashboardRepository = TMDBDashboardRepository() + + func fetchPopularDocumentaries() async throws -> [TrendingItem] { + return try await popularDocumentaryListRepository.fetchPopularDocumentaries() + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingMovieListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingMovieListUseCase.swift new file mode 100644 index 00000000..d317158e --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingMovieListUseCase.swift @@ -0,0 +1,16 @@ +// +// DefaultTrendingMovieListUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +final class DefaultTrendingMovieListUseCase: TrendingMovieListUseCase { + let trendingMovieListRepository: DashboardRepository = TMDBDashboardRepository() + + func fetchTrendingMovies() async throws -> [TrendingItem] { + return try await trendingMovieListRepository.fetchTrendingMovies() + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingShowListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingShowListUseCase.swift new file mode 100644 index 00000000..c8329648 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultTrendingShowListUseCase.swift @@ -0,0 +1,16 @@ +// +// DefaultDashboardUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +final class DefaultTrendingShowListUseCase: TrendingShowListUseCase { + let trendingShowListRepository: DashboardRepository = TMDBDashboardRepository() + + func fetchTrendingShows() async throws -> [TrendingItem] { + return try await trendingShowListRepository.fetchTrendingShows() + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/PopularDocumentaryListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/PopularDocumentaryListUseCase.swift new file mode 100644 index 00000000..c1a1db22 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/PopularDocumentaryListUseCase.swift @@ -0,0 +1,12 @@ +// +// PopularDocumentaryListUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +protocol PopularDocumentaryListUseCase { + func fetchPopularDocumentaries() async throws -> [TrendingItem] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingMovieListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingMovieListUseCase.swift new file mode 100644 index 00000000..fcd13da6 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingMovieListUseCase.swift @@ -0,0 +1,12 @@ +// +// TrendingMovieListUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 16/3/23. +// + +import Foundation + +protocol TrendingMovieListUseCase { + func fetchTrendingMovies() async throws -> [TrendingItem] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingShowListUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingShowListUseCase.swift new file mode 100644 index 00000000..fab01240 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Dashboard/TrendingShowListUseCase.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol TrendingShowListUseCase { + func fetchTrendingShows() async throws -> [TrendingItem] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift new file mode 100644 index 00000000..15b5a222 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift @@ -0,0 +1,29 @@ +// +// DefaultFavoriteUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 11/3/23. +// + +import Foundation + +final class DefaultFavoriteUseCase: FavoriteUseCase { + private let favoriteRepository: FavoriteRepository = CoreDataFavoriteRepository() + private let favoriteTrainingRepository: FavoriteTrainingRepository = AmazonFavoriteTrainingRepository() + + func setFavorite(to newState: Bool, for show: ShowID) throws { + if newState { + favoriteRepository.insert(showId: show) + + Task(priority: .background) { + try? await favoriteTrainingRepository.post(mediaID: show, forUser: "Adolfo") + } + } else { + try favoriteRepository.delete(showId: show) + + Task(priority: .background) { + try? await favoriteTrainingRepository.delete(mediaID: show, forUser: "Adolfo") + } + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift new file mode 100644 index 00000000..09f2d3fd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift @@ -0,0 +1,12 @@ +// +// FavoriteUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 11/3/23. +// + +import Foundation + +protocol FavoriteUseCase { + func setFavorite(to newState: Bool, for show: ShowID) throws +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift new file mode 100644 index 00000000..3d6c6af5 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift @@ -0,0 +1,30 @@ +// +// DefaultShowUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +final class DefaultShowUseCase: ShowUseCase { + private(set) var showRepository: ShowRepository = TMDBShowRepository() + private(set) var fetchFavorite: FetchFavoriteRepository = CoreDataFetchFavoriteRepository() + + /* + init(repository: ShowRepository) { + self.showRepository = repository + } + */ + func fetchShow(identifiedAs showId: Int) async throws -> Show { + do { + var show = try await self.showRepository.fetchShow(identifiedAs: showId) + show.isFavorite = try fetchFavorite.existFavoriteFor(showID: showId) + + return show + } catch let error { + print("🚨 No podemos recuperar todos los datos de la serie. \(error)") + throw GlobantPlusError.emptyResults + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift new file mode 100644 index 00000000..4ee38d61 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift @@ -0,0 +1,12 @@ +// +// ShowUseCase.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +protocol ShowUseCase { + func fetchShow(identifiedAs showId: Int) async throws -> Show +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Info.plist b/Examples/GlobantPlus/App/GlobantPlus/Info.plist new file mode 100644 index 00000000..f448cd22 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Info.plist @@ -0,0 +1,18 @@ + + + + + API_AUTH_KEY + $(TMDB_API_AUTH_KEY) + API_KEY + $(TMDB_API_KEY) + AWS_ACCESS_KEY_ID + $(AWS_ACCESS_KEY_ID) + AWS_SECRET_ACCESS_KEY + $(AWS_SECRET_ACCESS_KEY) + SQS_QUEUE_URL + $(AWS_SQS_QUEUE_URL) + API_GATEWAY_URL + $(AWS_API_GATEWAY_URL) + + diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..52b87a31 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,14 @@ +{ + "colors" : [ + { + "idiom" : "universal" + }, + { + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..795cce17 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json new file mode 100644 index 00000000..de59d885 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..795cce17 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..795cce17 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..b65f0cdd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json new file mode 100644 index 00000000..de59d885 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..b65f0cdd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 00000000..b65f0cdd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100644 index 00000000..f47ba43d --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,32 @@ +{ + "assets" : [ + { + "filename" : "App Icon - App Store.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "1280x768" + }, + { + "filename" : "App Icon.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "400x240" + }, + { + "filename" : "Top Shelf Image Wide.imageset", + "idiom" : "tv", + "role" : "top-shelf-image-wide", + "size" : "2320x720" + }, + { + "filename" : "Top Shelf Image.imageset", + "idiom" : "tv", + "role" : "top-shelf-image", + "size" : "1920x720" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json new file mode 100644 index 00000000..b65f0cdd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100644 index 00000000..b65f0cdd --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift new file mode 100644 index 00000000..da3289b5 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift @@ -0,0 +1,18 @@ +// +// DashboardView+Model.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +extension DashboardView { + struct Model: Identifiable { + var id: Int + var title: String + + var posterPath: String? + var backdropPath: String? + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift new file mode 100644 index 00000000..6e2046da --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift @@ -0,0 +1,93 @@ +// +// DashboardView.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import SwiftUI +import GlobantPlusUI + +struct DashboardView: View { + @StateObject private var viewModel = DefaultDashboardViewModel() + + //@Environment(\.isFocused) var focused: Bool + + var body: some View { + GeometryReader { proxy in + ScrollView([ .vertical ], showsIndicators: false) { + Text("Trending Shows") + .premiereTextStyle(.title) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 32) + + ScrollView([ .horizontal ], showsIndicators: false) { + LazyHStack(alignment: .center, spacing: 32) { + ForEach(viewModel.trendingShows) { trendingShow in + NavigationLink(destination: ShowView(showID: trendingShow.id)) { + ShowBackdrop(imagePath: trendingShow.backdropPath, title: trendingShow.title, tagline: "This is a tagline") + .frame(width: 425) + } + .buttonStyle(.plain) + } + } + } + .frame(width: proxy.size.width) + + + Text("Trending Movies") + .premiereTextStyle(.title) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 32) + + ScrollView([ .horizontal ], showsIndicators: false) { + LazyHStack(alignment: .center, spacing: 16) { + ForEach(viewModel.trendingMovies) { trendingMovie in + NavigationLink(value: trendingMovie.title) { + Poster(path: trendingMovie.posterPath) + .cornerRadius(8) + .shadow(radius: 8) + .frame(width: 375) + } + .buttonStyle(.plain) + } + } + } + + Text("Trending Documentaries") + .premiereTextStyle(.title) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 32) + + ScrollView([ .horizontal ], showsIndicators: false) { + LazyHStack(alignment: .center, spacing: 32) { + ForEach(viewModel.popularDocumentaries) { popularDocumentary in + NavigationLink(destination: ShowView(showID: popularDocumentary.id)) { + ShowBackdrop(imagePath: popularDocumentary.backdropPath, title: popularDocumentary.title, tagline: "This is a tagline") + .frame(width: 425) + } + .buttonStyle(.plain) + } + } + } + .frame(width: proxy.size.width) + + Text("Spain Top 10") + .premiereTextStyle(.title) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 32) + } + .task { + await viewModel.fetchTrendingMovies() + await viewModel.fetchTrendingShows() + await viewModel.fetchPopularDocumentaries() + } + } + } +} + +struct DashboardView_Previews: PreviewProvider { + static var previews: some View { + DashboardView() + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift new file mode 100644 index 00000000..f9bc9e71 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift @@ -0,0 +1,23 @@ +// +// DashboardViewModel.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +protocol DashboardViewModelInput { + func fetchTrendingShows() async + func fetchTrendingMovies() async + + func fetchPopularDocumentaries() async +} + +protocol DashboardViewModelOutput { + var trendingShows: [DashboardView.Model] { get } + var trendingMovies: [DashboardView.Model] { get } + var popularDocumentaries: [DashboardView.Model] { get } +} + +typealias DashboardViewModel = DashboardViewModelInput & DashboardViewModelOutput diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift new file mode 100644 index 00000000..e4d3df76 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift @@ -0,0 +1,67 @@ +// +// DefaultDashboardViewModel.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +final class DefaultDashboardViewModel: DashboardViewModel, ObservableObject { + @Published private(set) var trendingShows = [DashboardView.Model]() + @Published private(set) var trendingMovies = [DashboardView.Model]() + @Published private(set) var popularDocumentaries = [DashboardView.Model]() + + private(set) var useCase = DashboardFacade() + + func fetchTrendingShows() async { + do { + let shows = try await useCase.fetchTrendingShows() + + self.trendingShows = shows.map({ show in + var model = DashboardView.Model(id: show.id, title: show.title) + + model.posterPath = show.posterPath + model.backdropPath = show.backdropPath + + return model + }) + } catch let error { + print("🚨 \(error)") + } + } + + func fetchTrendingMovies() async { + do { + let movies = try await useCase.fetchTrendingMovies() + + self.trendingMovies = movies.map({ movie in + var model = DashboardView.Model(id: movie.id, title: movie.title) + + model.posterPath = movie.posterPath + model.backdropPath = movie.backdropPath + + return model + }) + } catch let error { + print("🚨 \(error)") + } + } + + func fetchPopularDocumentaries() async { + do { + let documentaries = try await useCase.fetchPopularDocumentaries() + + self.popularDocumentaries = documentaries.map({ documentary in + var model = DashboardView.Model(id: documentary.id, title: documentary.title) + + model.posterPath = documentary.posterPath + model.backdropPath = documentary.backdropPath + + return model + }) + } catch let error { + print("🚨 \(error)") + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift new file mode 100644 index 00000000..52f9a3b9 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift @@ -0,0 +1,27 @@ +// +// ShowView+Model.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +extension ShowView { + struct Model: Identifiable { + var id = 0 + var title = "" + var tagline = "" + var overview = "" + var genres = "" + + var episodeCount = 0 + var seasonCount = 0 + var episodeRuntime = 0 + var voteAverage = 0.0 + + var backdropPath: String? + + var isFavorite = false + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift new file mode 100644 index 00000000..f916a57a --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift @@ -0,0 +1,98 @@ +// +// ShowView.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 18/1/23. +// + +import SwiftUI +import GlobantPlusUI + +struct ShowView: View { + @StateObject private var viewModel = DefaultShowViewModel() + + var showID: Int + + var body: some View { + ZStack { + Backdrop(path: viewModel.show.backdropPath) + .edgesIgnoringSafeArea(.all) + .animation(.easeIn) + + VStack(alignment: .leading, spacing: 8) { + Spacer() + + HStack(alignment: .center, spacing: 48) { + buttonsSet + .frame(width: 350) + + showOverview + .padding(.horizontal, 48) + + showDetails + .frame(width: 350) + } + } + .padding(.bottom, 24) + } + .task { + await viewModel.fetchInformationFor(show: showID) + } + } + + private var buttonsSet: some View { + VStack(alignment: .leading, spacing: 24) { + Button { + print("") + } label: { + Label("Ver episodio", systemImage: "play.fill") + .premiereTextStyle(.body) + .frame(width: 300) + } + .buttonStyle(.borderedProminent) + + + Button { + viewModel.manageFavoriteState() + } label: { + Label(viewModel.show.isFavorite ? "En favoritos" : "Añadir a favoritos", + systemImage: viewModel.show.isFavorite ? "checkmark" : "plus") + .premiereTextStyle(.body) + .frame(width: 300) + } + .buttonStyle(.borderedProminent) + } + } + + private var showOverview: some View { + VStack(alignment: .leading, spacing: 8) { + Text(viewModel.show.title) + .premiereTextStyle(.title) + + Text(viewModel.show.overview) + .premiereTextStyle(.body) + .lineLimit(3) + } + } + + private var showDetails: some View { + VStack(alignment: .leading, spacing: 8) { + Text("Genres **\(viewModel.show.genres)**") + .premiereTextStyle(.data) + + Text("Seasons \(viewModel.show.seasonCount)") + .premiereTextStyle(.data) + + if viewModel.show.episodeRuntime > 0 { + Text("\(viewModel.show.episodeRuntime) minutes") + .premiereTextStyle(.data) + } + } + } +} + +struct ShowView_Previews: PreviewProvider { + static var previews: some View { + ShowView(showID: 111_837) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift new file mode 100644 index 00000000..20350e11 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift @@ -0,0 +1,57 @@ +// +// DefaultShowViewModel.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +final class DefaultShowViewModel: ShowViewModel, ObservableObject, Trackable { + @Published private(set) var show = ShowView.Model() + + private(set) var useCase: ShowUseCase = DefaultShowUseCase() + private(set) var favoriteUseCase: FavoriteUseCase = DefaultFavoriteUseCase() +/* + init(useCase: ShowUseCase) { + self.useCase = useCase + } +*/ + func fetchInformationFor(show id: Int) async { + do { + let domainShow = try await useCase.fetchShow(identifiedAs: id) + + var model = ShowView.Model() + model.id = domainShow.id + model.title = domainShow.title + model.tagline = domainShow.tagline + model.overview = domainShow.overview + model.backdropPath = domainShow.backdropPath + model.genres = domainShow.genres.map({ $0.name }).joined(separator: ", ") + + model.episodeCount = domainShow.episodeCount + model.seasonCount = domainShow.seasonCount + model.episodeRuntime = domainShow.episodeRuntime + model.voteAverage = domainShow.voteAverage + + model.isFavorite = domainShow.isFavorite + + self.show = model + } catch let error { + print("\(error)") + } + + self.trackUser("Adolfo", activity: "ShowDetails", relatedToMedia: show.id) + } + + func manageFavoriteState() { + do { + try self.favoriteUseCase.setFavorite(to: !self.show.isFavorite, for: show.id) + self.show.isFavorite.toggle() + } catch let error { + print("🚨 No podemos actualizar el estado de *favorito* de la serie. \(error)") + } + + self.trackUser("Adolfo", activity: "Favorite", relatedToMedia: show.id) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift new file mode 100644 index 00000000..14de3223 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift @@ -0,0 +1,19 @@ +// +// ShowViewModel.swift +// GlobantPlus +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation + +protocol ShowViewModelInput { + func fetchInformationFor(show id: Int) async + func manageFavoriteState() +} + +protocol ShowViewModelOutput { + var show: ShowView.Model { get } +} + +typealias ShowViewModel = ShowViewModelInput & ShowViewModelOutput diff --git a/Examples/GlobantPlus/App/GlobantPlus/Preview Content/Preview Assets.xcassets/Contents.json b/Examples/GlobantPlus/App/GlobantPlus/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlus/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/.gitignore b/Examples/GlobantPlus/App/GlobantPlusUI/.gitignore new file mode 100644 index 00000000..3b298120 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Package.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Package.swift new file mode 100644 index 00000000..5d142964 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "GlobantPlusUI", + platforms: [ + .tvOS(.v16) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "GlobantPlusUI", + type: .dynamic, + targets: ["GlobantPlusUI"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "GlobantPlusUI", + dependencies: []), + .testTarget( + name: "GlobantPlusUITests", + dependencies: ["GlobantPlusUI"]), + ] +) diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/README.md b/Examples/GlobantPlus/App/GlobantPlusUI/README.md new file mode 100644 index 00000000..330b462d --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/README.md @@ -0,0 +1,11 @@ +# GlobantPlusUI + +Paquete con los elementos visuales de **GlobantPlus** desarrollada con SwiftUI + +Los componentes actuales son: + +* Backdrop +* Poster +* ShowBackdrop +* Text (Diferentes estilos de texto) +* TopPoster (WIP) diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Backdrop/Backdrop.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Backdrop/Backdrop.swift new file mode 100644 index 00000000..42b10773 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Backdrop/Backdrop.swift @@ -0,0 +1,51 @@ +// +// SwiftUIView.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import SwiftUI + +public struct Backdrop: View { + private let backdropAspectRatio = 1.777 + private var url: URL? + + public var body: some View { + AsyncImage(url: url) { status in + switch status { + case .empty: + Rectangle() + .aspectRatio(backdropAspectRatio, contentMode: .fill) + .background(Color.black) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .overlay(alignment: .center) { + ProgressView() + } + case .success(let image): + image + .resizable() + .renderingMode(.original) + .aspectRatio(backdropAspectRatio, contentMode: .fill) + .frame(maxWidth: .infinity, maxHeight: .infinity) + + case .failure: + Image("PosterPlaceholder", bundle: Bundle.module) + .resizable() + .aspectRatio(backdropAspectRatio, contentMode: .fit) + } + } + } + + public init(path: String?) { + if let path { + self.url = URL(string: path) + } + } +} + +struct Backdrop_Previews: PreviewProvider { + static var previews: some View { + Backdrop(path: "fake") + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Poster/Poster.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Poster/Poster.swift new file mode 100644 index 00000000..86d05593 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Poster/Poster.swift @@ -0,0 +1,53 @@ +// +// SwiftUIView.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import SwiftUI +import UIKit + +public struct Poster: View { + private let posterAspectRatio = 0.6665 + private var url: URL? + + public var body: some View { + AsyncImage(url: url) { status in + switch status { + case .empty: + Rectangle() + .aspectRatio(posterAspectRatio, contentMode: .fit) + .background(Color.black) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .overlay(alignment: .center) { + ProgressView() + } + case .success(let image): + image + .resizable() + .renderingMode(.original) + .aspectRatio(posterAspectRatio, contentMode: .fill) + .frame(maxWidth: .infinity, maxHeight: .infinity) + + case .failure: + Image("PosterPlaceholder", bundle: Bundle.module) + .resizable() + .aspectRatio(posterAspectRatio, contentMode: .fit) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + } + + public init(path: String?) { + if let path { + self.url = URL(string: path) + } + } +} + +struct Poster_Previews: PreviewProvider { + static var previews: some View { + Poster(path: "fake") + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Dark.pdf b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Dark.pdf new file mode 100644 index 00000000..d521b61d Binary files /dev/null and b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Dark.pdf differ diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Light.pdf b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Light.pdf new file mode 100644 index 00000000..bb893380 Binary files /dev/null and b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Backdrop-Light.pdf differ diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Contents.json new file mode 100644 index 00000000..97c32b1b --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/BackdropPlaceholder.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "Backdrop-Light.pdf", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Backdrop-Dark.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/Contents.json b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/PosterPlaceholder.imageset/Contents.json b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/PosterPlaceholder.imageset/Contents.json new file mode 100644 index 00000000..cb40d9cb --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Resources/Media.xcassets/PosterPlaceholder.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/ShowBackdrop/ShowBackdrop.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/ShowBackdrop/ShowBackdrop.swift new file mode 100644 index 00000000..9da6c47f --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/ShowBackdrop/ShowBackdrop.swift @@ -0,0 +1,44 @@ +// +// SwiftUIView.swift +// +// +// Created by Adolfo Vera Blasco on 12/1/23. +// + +import SwiftUI + +public struct ShowBackdrop: View { + public var imagePath: String? + public var title: String + public var tagline: String + + public var body: some View { + VStack(alignment: .leading, spacing: 16) { + Backdrop(path: imagePath) + .cornerRadius(8) + .shadow(radius: 8) + .frame(maxWidth: .infinity, maxHeight: .infinity) + + Text(title) + .premiereTextStyle(.mediaName) + .padding(.horizontal, 8) + + Text(tagline) + .premiereTextStyle(.data) + .padding(.horizontal, 8) + } + } + + public init(imagePath: String? = nil, title: String, tagline: String) { + self.imagePath = imagePath + self.title = title + self.tagline = tagline + } +} + +struct ShowBackdrop_Previews: PreviewProvider { + static var previews: some View { + ShowBackdrop(imagePath: "https://www.themoviedb.org/t/p/original/tLwEXm2nG64Tce00d59rPNI8ePh.jpg", title: "The Americans", tagline: "Thriller, Adventure") + .frame(width: 375) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/GlobantPlusTextStyleModifier.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/GlobantPlusTextStyleModifier.swift new file mode 100644 index 00000000..bf95b4f7 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/GlobantPlusTextStyleModifier.swift @@ -0,0 +1,132 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 12/1/23. +// + +import Foundation +import SwiftUI + +public struct GlobantPlusTextStyleModifier: ViewModifier { + private let font: GlobantPlusTextStyleModifier.Font + private let width: GlobantPlusTextStyleModifier.Width + private let weight: GlobantPlusTextStyleModifier.Weight + private let color: Color + + init(font: GlobantPlusTextStyleModifier.Font, width: GlobantPlusTextStyleModifier.Width, weight: GlobantPlusTextStyleModifier.Weight) { + self.font = font + self.width = width + self.weight = weight + self.color = .primary + } + + init(style: GlobantPlusTextStyleModifier.Style) { + switch style { + case .largeTitle: + self.font = .largeTitle + self.width = .expanded + self.weight = .bold + self.color = .primary + case .title: + self.font = .title + self.width = .compressed + self.weight = .bold + self.color = .primary + case .mediaName: + self.font = .body + self.width = .standard + self.weight = .bold + self.color = .primary + case .body: + self.font = .body + self.width = .standard + self.weight = .regular + self.color = .primary + case .note: + self.font = .body + self.width = .standard + self.weight = .regular + self.color = .primary + case .data: + self.font = .body + self.width = .compressed + self.weight = .regular + self.color = .primary + } + } + + public func body(content: Content) -> some View { + content + .font(self.font.value) + .fontWidth(self.width.fontWidth) + .fontWeight(self.weight.fontWeight) + .foregroundColor(self.color) + } + +} + +extension GlobantPlusTextStyleModifier { + public enum Style { + case largeTitle + case title + case mediaName + case body + case note + case data + } + + public enum Font { + case largeTitle + case title + case body + case note + + var value: SwiftUI.Font { + switch self { + case .largeTitle: + return .largeTitle + case .title: + return .title + case .body: + return .body + case .note: + return .caption + } + } + } + + public enum Width { + case compressed + case standard + case expanded + + var fontWidth: SwiftUI.Font.Width { + switch self { + case .compressed: + return .compressed + case .standard: + return .standard + case .expanded: + return .expanded + } + } + } + + public enum Weight { + case regular + case bold + case light + + var fontWeight: SwiftUI.Font.Weight { + switch self { + case .regular: + return .regular + case .bold: + return .bold + case .light: + return .light + } + } + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/View+Text.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/View+Text.swift new file mode 100644 index 00000000..f8236871 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Text/View+Text.swift @@ -0,0 +1,19 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 12/1/23. +// + +import Foundation +import SwiftUI + +extension View { + public func premiereTextStyle(font: GlobantPlusTextStyleModifier.Font = .body, width: GlobantPlusTextStyleModifier.Width = .standard, weight: GlobantPlusTextStyleModifier.Weight = .regular) -> some View { + modifier(GlobantPlusTextStyleModifier(font: font, width: width, weight: weight)) + } + + public func premiereTextStyle(_ customStyle: GlobantPlusTextStyleModifier.Style) -> some View { + modifier(GlobantPlusTextStyleModifier(style: customStyle)) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Top/TopPoster.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Top/TopPoster.swift new file mode 100644 index 00000000..1ca57128 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Sources/GlobantPlusUI/Top/TopPoster.swift @@ -0,0 +1,76 @@ +// +// SwiftUIView.swift +// +// +// Created by Adolfo Vera Blasco on 14/1/23. +// + +import SwiftUI + +public struct TopPoster: View { + public enum BagdePosition { + case top + case center + case bottom + + var alignment: Alignment { + switch self { + case .top: + return .topLeading + case .center: + return .leading + case .bottom: + return .bottomLeading + } + } + } + + public var imagePath: String? + public var order: Int + public var position: TopPoster.BagdePosition + + public var body: some View { + HStack(alignment: .center, spacing: 0) { + badge + .frame(maxWidth: .infinity) + + Poster(path: imagePath) + .cornerRadius(8) + .shadow(radius: 8) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + + private var badge: some View { + ZStack(alignment: .center) { + RoundedRectangle(cornerRadius: 8) + .foregroundColor(.white) + .opacity(1.0) + + HStack(alignment: .center, spacing: 2) { + Text("#") + .font(.system(size: 40, weight: .semibold, design: .rounded)) + .foregroundColor(.black) + + Text("1") + .font(.system(size: 60, weight: .black, design: .rounded)) + .foregroundColor(.black) + } + } + } + + public init(path: String?, order: Int, at position: TopPoster.BagdePosition) { + self.imagePath = path + self.order = order + self.position = position + } +} + +struct TopPoster_Previews: PreviewProvider { + static var previews: some View { + TopPoster(path: "https://www.themoviedb.org/t/p/original/axb5KzE3cfwmKhnx33wmHJtADM8.jpg", + order: 1, + at: .top) + .frame(width: 500) + } +} diff --git a/Examples/GlobantPlus/App/GlobantPlusUI/Tests/GlobantPlusUITests/GlobantPlusUITests.swift b/Examples/GlobantPlus/App/GlobantPlusUI/Tests/GlobantPlusUITests/GlobantPlusUITests.swift new file mode 100644 index 00000000..f1e78588 --- /dev/null +++ b/Examples/GlobantPlus/App/GlobantPlusUI/Tests/GlobantPlusUITests/GlobantPlusUITests.swift @@ -0,0 +1,11 @@ +import XCTest +@testable import GlobantPlusUI + +final class GlobantPlusUITests: XCTestCase { + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(true, true) + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/.gitignore b/Examples/GlobantPlus/App/MovieDB/.gitignore new file mode 100644 index 00000000..3b298120 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Examples/GlobantPlus/App/MovieDB/Package.swift b/Examples/GlobantPlus/App/MovieDB/Package.swift new file mode 100644 index 00000000..32b88342 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Package.swift @@ -0,0 +1,33 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MovieDB", + platforms: [ + .iOS(.v16), + .tvOS(.v16), + .macOS(.v13) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "MovieDB", + type: .dynamic, + targets: ["MovieDB"]), + ], + dependencies: [ + .package(path: "../Resty") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "MovieDB", + dependencies: [ "Resty" ]), + .testTarget( + name: "MovieDBTests", + dependencies: ["MovieDB"]), + ] +) diff --git a/Examples/GlobantPlus/App/MovieDB/README.md b/Examples/GlobantPlus/App/MovieDB/README.md new file mode 100644 index 00000000..2ae35e31 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/README.md @@ -0,0 +1,10 @@ +# MovieDB + +Un cliente para consultar el API de The Movie Database. + +De momento sólo están disponibles las siguiente operaciones + +* Discover +* Genres +* Show +* Trending diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/ImageEndpoint.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/ImageEndpoint.swift new file mode 100644 index 00000000..ba182c30 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/ImageEndpoint.swift @@ -0,0 +1,34 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation +import Resty + +enum ImageEndpoint { + case poster(size: PosterSize, path: String) + case backdrop(size: BackdropSize, path: String) + case company(size: LogoSize, path: String) +} + +extension ImageEndpoint { + var basePath: String { + return "https://image.tmdb.org/t/p" + } +} + +extension ImageEndpoint: Endpoint { + var path: String { + switch self { + case .poster(let size, let path): + return "\(basePath)/\(size)\(path)" + case .backdrop(let size, let path): + return "\(basePath)/\(size)\(path)" + case .company(let size, let path): + return "\(basePath)/\(size)\(path)" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/MovieDatabaseEndpointEndpoint.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/MovieDatabaseEndpointEndpoint.swift new file mode 100644 index 00000000..f33ccb9c --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Endpoints/MovieDatabaseEndpointEndpoint.swift @@ -0,0 +1,37 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation +import Resty + +enum MovieDatabaseEndpoint { + case trending(kind: MediaKind, period: TimeWindow) + case genre(source: GenreSource) + case discover(kind: DiscoverMedia) + case show(id: Int) +} + +extension MovieDatabaseEndpoint { + var basePath: String { + return "https://api.themoviedb.org/3" + } +} + +extension MovieDatabaseEndpoint: Endpoint { + var path: String { + switch self { + case .trending(let kind, let period): + return "\(basePath)/trending/\(kind.description)/\(period.description)" + case .genre(let source): + return "\(basePath)/genre/\(source.description)/list" + case .discover(let kind): + return "\(basePath)/discover/\(kind.description)" + case .show(let id): + return "\(basePath)/tv/\(id)" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Extensions/DateFormatter+MovieDB.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Extensions/DateFormatter+MovieDB.swift new file mode 100644 index 00000000..ef55610d --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Extensions/DateFormatter+MovieDB.swift @@ -0,0 +1,17 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 11/1/23. +// + +import Foundation + +extension DateFormatter { + static var movieDatabaseFormatter: DateFormatter { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + + return formatter + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/AuthorizationMode.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/AuthorizationMode.swift new file mode 100644 index 00000000..3ba87d7f --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/AuthorizationMode.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public enum AuthorizationMode { + case apiKey(key: String) + case header(token: String) +} + +extension AuthorizationMode { + public var value: String { + switch self { + case .apiKey(let key): + return key + case .header(let token): + return token + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/DiscoverMedia.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/DiscoverMedia.swift new file mode 100644 index 00000000..628f5ad5 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/DiscoverMedia.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 10/1/23. +// + +import Foundation + +enum DiscoverMedia { + case movie + case tv +} + +extension DiscoverMedia: CustomStringConvertible { + public var description: String { + switch self { + case .movie: + return "movie" + case .tv: + return "tv" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverMovie.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverMovie.swift new file mode 100644 index 00000000..7b97655d --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverMovie.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 10/1/23. +// + +import Foundation + +public struct MDBDiscoverMovie: Codable, Identifiable { + public private(set) var id: Int + public private(set) var title: String + public private(set) var originalTitle: String + public private(set) var originalLanguage: String + public private(set) var overview: String + + public private(set) var genreIds: [Int] + + public private(set) var isAdultContent: Bool + public private(set) var isVideo: Bool + + public private(set) var backdropPath: String? + public private(set) var posterPath: String? + + public private(set) var voteAverage: Double + public private(set) var voteCount: Int + public private(set) var popularity: Double + + private enum CodingKeys: String, CodingKey { + case id + case title + case originalTitle = "original_title" + case originalLanguage = "original_language" + case overview + case genreIds = "genre_ids" + case isAdultContent = "adult" + case isVideo = "video" + case backdropPath = "backdrop_path" + case posterPath = "poster_path" + case voteAverage = "vote_average" + case voteCount = "vote_count" + case popularity = "popularity" + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverShow.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverShow.swift new file mode 100644 index 00000000..cf4d92e1 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/MDBDiscoverShow.swift @@ -0,0 +1,41 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 10/1/23. +// + +import Foundation + +public struct MDBDiscoverShow: Codable, Identifiable { + public private(set) var id: Int + public private(set) var title: String + public private(set) var originalTitle: String + public private(set) var originalLanguage: String + public private(set) var originCountries: [String] + public private(set) var overview: String + + public private(set) var genreIds: [Int] + + public private(set) var backdropPath: String? + public private(set) var posterPath: String? + + public private(set) var voteAverage: Double + public private(set) var voteCount: Int + public private(set) var popularity: Double + + private enum CodingKeys: String, CodingKey { + case id + case title = "name" + case originalTitle = "original_name" + case originalLanguage = "original_language" + case originCountries = "origin_country" + case overview + case genreIds = "genre_ids" + case backdropPath = "backdrop_path" + case posterPath = "poster_path" + case voteAverage = "vote_average" + case voteCount = "vote_count" + case popularity = "popularity" + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowKind.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowKind.swift new file mode 100644 index 00000000..e52d92ad --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowKind.swift @@ -0,0 +1,18 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 14/1/23. +// + +import Foundation + +public enum ShowKind: Int { + case documentary = 0 + case news + case miniseries + case reality + case scripted + case talkShow + case video +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowStatus.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowStatus.swift new file mode 100644 index 00000000..e3f9a344 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/ShowStatus.swift @@ -0,0 +1,17 @@ +// +// File 2.swift +// +// +// Created by Adolfo Vera Blasco on 14/1/23. +// + +import Foundation + +public enum ShowStatus: Int { + case returningSeries = 0 + case planned + case inProduction + case ended + case cancelled + case pilot +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/SortField.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/SortField.swift new file mode 100644 index 00000000..c8db571d --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Discover/SortField.swift @@ -0,0 +1,39 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 10/1/23. +// + +import Foundation + +public enum SortField { + case popularity + case releaseDate + case revenue + case primaryReleaseDate + case originalTitle + case voteAverage + case voteCount +} + +extension SortField: CustomStringConvertible { + public var description: String { + switch self { + case .popularity: + return "popularity" + case .releaseDate: + return "release_date" + case .revenue: + return "revenue" + case .primaryReleaseDate: + return "primary_release_date" + case .originalTitle: + return "original_title" + case .voteAverage: + return "vote_average" + case .voteCount: + return "vote_count" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/GenreSource.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/GenreSource.swift new file mode 100644 index 00000000..c14dea9c --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/GenreSource.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public enum GenreSource { + case movie + case tv +} + +extension GenreSource: CustomStringConvertible { + public var description: String { + switch self { + case .movie: + return "movie" + case .tv: + return "tv" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenre.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenre.swift new file mode 100644 index 00000000..624d6378 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenre.swift @@ -0,0 +1,13 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public struct MDBGenre: Codable { + public private(set) var id: Int + public private(set) var name: String +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenreList.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenreList.swift new file mode 100644 index 00000000..2f91376a --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Genres/MDBGenreList.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +struct MDBGenreList: Codable { + var genres: [MDBGenre] +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/BackdropSize.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/BackdropSize.swift new file mode 100644 index 00000000..e801d3cf --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/BackdropSize.swift @@ -0,0 +1,31 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public enum BackdropSize { + case small + case regular + case large + case original +} + +extension BackdropSize: CustomStringConvertible { + public var description: String { + switch self { + case .small: + return "w300" + case .regular: + return "w780" + case .large: + return "w1280" + case .original: + return "original" + + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/LogoSize.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/LogoSize.swift new file mode 100644 index 00000000..f40bbc42 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/LogoSize.swift @@ -0,0 +1,34 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public enum LogoSize { + case extraSmall + case small + case regular + case large + case original +} + +extension LogoSize: CustomStringConvertible { + public var description: String { + switch self { + case .extraSmall: + return "w92" + case .small: + return "w185" + case .regular: + return "w300" + case .large: + return "w500" + case .original: + return "original" + + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/PosterSize.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/PosterSize.swift new file mode 100644 index 00000000..c7023eba --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Images/PosterSize.swift @@ -0,0 +1,34 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public enum PosterSize { + case extraSmall + case small + case regular + case large + case original +} + +extension PosterSize: CustomStringConvertible { + public var description: String { + switch self { + case .extraSmall: + return "w185" + case .small: + return "w342" + case .regular: + return "w500" + case .large: + return "w780" + case .original: + return "original" + + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/MovieDBError.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/MovieDBError.swift new file mode 100644 index 00000000..eac96a1f --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/MovieDBError.swift @@ -0,0 +1,13 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public enum MovieDBError: Error { + case authorization + case emptyResults +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/PaginatedResult.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/PaginatedResult.swift new file mode 100644 index 00000000..b5e9b220 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/PaginatedResult.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public struct PaginatedResult: Codable { + var page: Int + var pageCount: Int + var resultCount: Int + var results: [Item] + + private enum CodingKeys: String, CodingKey { + case page + case pageCount = "total_pages" + case resultCount = "total_results" + case results + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Show/MDBShow.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Show/MDBShow.swift new file mode 100644 index 00000000..78bec0b8 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Show/MDBShow.swift @@ -0,0 +1,119 @@ +import Foundation + +public struct MDBShow: Codable, Identifiable { + public private(set) var id: Int + public private(set) var title: String + public private(set) var tagline: String + public private(set) var originalTitle: String + public private(set) var originalLanguage: String + public private(set) var originCountries: [String] + public private(set) var overview: String + public private(set) var isInProduction: Bool + public private(set) var currentStatus: String + public private(set) var homepage: String? + + public private(set) var genres: [MDBGenre] + + public private(set) var backdropPath: String? + public private(set) var posterPath: String? + + public private(set) var voteAverage: Double + public private(set) var voteCount: Int + public private(set) var popularity: Double + + public private(set) var episodesRuntime: [Int] + + public private(set) var firstAirDate: Date + public private(set) var lastAirDate: Date + + public private(set) var networks: [MDBShow.Network] + public private(set) var productionCompanies: [MDBShow.ProductionCompany] + + public private(set) var seasonCount: Int + public private(set) var episodeCount: Int + + public private(set) var seasons: [MDBShow.Season] + + private enum CodingKeys: String, CodingKey { + case id + case title = "name" + case tagline + case originalTitle = "original_name" + case originalLanguage = "original_language" + case originCountries = "origin_country" + case overview + case isInProduction = "in_production" + case currentStatus = "status" + case homepage + case genres + case backdropPath = "backdrop_path" + case posterPath = "poster_path" + case voteAverage = "vote_average" + case voteCount = "vote_count" + case popularity = "popularity" + case episodesRuntime = "episode_run_time" + case firstAirDate = "first_air_date" + case lastAirDate = "last_air_date" + case networks + case productionCompanies = "production_companies" + case seasonCount = "number_of_seasons" + case episodeCount = "number_of_episodes" + case seasons + } +} + +public extension MDBShow { + typealias ProductionCompany = Network + + struct Season: Codable, Identifiable { + public private(set) var id: Int + public private(set) var name: String + public private(set) var overview: String + public private(set) var posterPath: String? + public private(set) var seasonNumber: Int + public private(set) var episodeCount: Int + public private(set) var airDate: String? + + private enum CodingKeys: String, CodingKey { + case id + case name + case overview + case posterPath = "poster_path" + case seasonNumber = "season_number" + case episodeCount = "episode_count" + case airDate = "air_date" + } + } + + struct Network: Codable, Identifiable { + public private(set) var id: Int + public private(set) var name: String + public private(set) var logoPath: String? + public private(set) var country: String + + private enum CodingKeys: String, CodingKey { + case id + case name + case logoPath = "logo_path" + case country = "origin_country" + } + } + + struct SpokenLanguage: Codable, Identifiable { + public private(set) var englishName: String + public private(set) var name: String + public private(set) var iso6391: String + + public var id: String { + return self.iso6391 + } + + private enum CodingKeys: String, CodingKey { + case englishName = "english_name" + case name + case iso6391 = "iso_639_1" + } + } +} + + diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingMovie.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingMovie.swift new file mode 100644 index 00000000..c7ebe2f0 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingMovie.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public struct MDBTrendingMovie: Codable, Identifiable { + public private(set) var id: Int + public private(set) var title: String + public private(set) var originalTitle: String + public private(set) var originalLanguage: String + public private(set) var overview: String + + public private(set) var genreIds: [Int] + + public private(set) var isAdultContent: Bool + public private(set) var isVideo: Bool + + public private(set) var backdropPath: String + public private(set) var posterPath: String + + public private(set) var voteAverage: Double + public private(set) var voteCount: Int + public private(set) var popularity: Double + + private enum CodingKeys: String, CodingKey { + case id + case title + case originalTitle = "original_title" + case originalLanguage = "original_language" + case overview + case genreIds = "genre_ids" + case isAdultContent = "adult" + case isVideo = "video" + case backdropPath = "backdrop_path" + case posterPath = "poster_path" + case voteAverage = "vote_average" + case voteCount = "vote_count" + case popularity = "popularity" + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingShow.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingShow.swift new file mode 100644 index 00000000..13eac2d2 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MDBTrendingShow.swift @@ -0,0 +1,44 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation + +public struct MDBTrendingShow: Codable, Identifiable { + public private(set) var id: Int + public private(set) var title: String + public private(set) var originalTitle: String + public private(set) var originalLanguage: String + public private(set) var originCountries: [String] + public private(set) var overview: String + + public private(set) var genreIds: [Int] + + public private(set) var isAdultContent: Bool + + public private(set) var backdropPath: String + public private(set) var posterPath: String + + public private(set) var voteAverage: Double + public private(set) var voteCount: Int + public private(set) var popularity: Double + + private enum CodingKeys: String, CodingKey { + case id + case title = "name" + case originalTitle = "original_name" + case originalLanguage = "original_language" + case originCountries = "origin_country" + case overview + case genreIds = "genre_ids" + case isAdultContent = "adult" + case backdropPath = "backdrop_path" + case posterPath = "poster_path" + case voteAverage = "vote_average" + case voteCount = "vote_count" + case popularity = "popularity" + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MediaKind.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MediaKind.swift new file mode 100644 index 00000000..5f699c66 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/MediaKind.swift @@ -0,0 +1,30 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public enum MediaKind { + case all + case movie + case tv + case person +} + +extension MediaKind: CustomStringConvertible { + public var description: String { + switch self { + case .all: + return "all" + case .movie: + return "movie" + case .tv: + return "tv" + case .person: + return "person" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/TimeWindow.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/TimeWindow.swift new file mode 100644 index 00000000..4a91c7e8 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Model/Trending/TimeWindow.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation + +public enum TimeWindow { + case day + case week +} + +extension TimeWindow: CustomStringConvertible { + public var description: String { + switch self { + case .day: + return "day" + case .week: + return "week" + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Discover.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Discover.swift new file mode 100644 index 00000000..ca7bc906 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Discover.swift @@ -0,0 +1,94 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 9/1/23. +// + +import Foundation +import Resty + +public extension MovieDB { + func discoverMovies(sortedBy field: SortField) async throws -> [MDBDiscoverMovie] { + let popularParameters = [ + DiscoverParameter.sort(by: field, ascendent: false) + ] + + let response = try await self.get(endpoint: MovieDatabaseEndpoint.discover(kind: .movie), withParameters: popularParameters) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let discoveredMovies = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return discoveredMovies.results + } + + func discoverShows(sortedBy field: SortField) async throws -> [MDBDiscoverShow] { + let popularParameters = [ + DiscoverParameter.sort(by: field, ascendent: false) + ] + + let response = try await self.get(endpoint: MovieDatabaseEndpoint.discover(kind: .tv), withParameters: popularParameters) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let discoveredShows = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return discoveredShows.results + } + + func discoverDocumentaries(sortedBy field: SortField) async throws -> [MDBDiscoverShow] { + let discoverParameters: [QueryParameter] = [ + DiscoverParameter.sort(by: field, ascendent: false), + DiscoverShowParameter.kind(value: .documentary) + ] + + let response = try await self.get(endpoint: MovieDatabaseEndpoint.discover(kind: .tv), withParameters: discoverParameters) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let discoveredShows = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return discoveredShows.results + } + + func upcomingMovieReleases(from startingDate: Date = Date()) async throws -> [MDBDiscoverMovie] { + let popularParameters = [ + DiscoverParameter.sort(by: .primaryReleaseDate, ascendent: false), + DiscoverParameter.primaryReleaseDate(date: startingDate, greaterThanThisDate: true) + ] + + let response = try await self.get(endpoint: MovieDatabaseEndpoint.discover(kind: .movie), withParameters: popularParameters) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let discoveredMovies = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return discoveredMovies.results + } + + func upcomingShowReleases(from startingDate: Date = Date()) async throws -> [MDBDiscoverShow] { + let popularParameters = [ + DiscoverParameter.sort(by: .primaryReleaseDate, ascendent: false), + DiscoverParameter.primaryReleaseDate(date: startingDate, greaterThanThisDate: true) + ] + + let response = try await self.get(endpoint: MovieDatabaseEndpoint.discover(kind: .tv), withParameters: popularParameters) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let discoveredShows = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return discoveredShows.results + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Genres.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Genres.swift new file mode 100644 index 00000000..8b28e387 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Genres.swift @@ -0,0 +1,16 @@ +import Foundation +import Resty + +extension MovieDB { + public func genres(for source: GenreSource) async throws -> [MDBGenre] { + let response = try await self.get(endpoint: MovieDatabaseEndpoint.genre(source: source)) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let genreList = try jsonDecoder.decode(MDBGenreList.self, from: data) + + return genreList.genres + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Images.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Images.swift new file mode 100644 index 00000000..fb35313d --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Images.swift @@ -0,0 +1,35 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 4/1/23. +// + +import Foundation +import Resty + +extension MovieDB { + public func makePosterUriFrom(path: String?, ofSize size: PosterSize) -> String? { + guard let path else { + return nil + } + + return ImageEndpoint.poster(size: size, path: path).path + } + + public func makeBackdropUriFrom(path: String?, ofSize size: BackdropSize) -> String? { + guard let path else { + return nil + } + + return ImageEndpoint.backdrop(size: size, path: path).path + } + + public func makeLogoUriFrom(path: String?, ofSize size: LogoSize) -> String? { + guard let path else { + return nil + } + + return ImageEndpoint.company(size: size, path: path).path + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Show.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Show.swift new file mode 100644 index 00000000..08b8c0ea --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Show.swift @@ -0,0 +1,28 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import Foundation +import Resty + +public extension MovieDB { + func showDetails(showId: Int) async throws -> MDBShow { + let response = try await self.get(endpoint: MovieDatabaseEndpoint.show(id: showId)) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + do { + let show_aux = try jsonDecoder.decode(MDBShow.self, from: data) + } catch let error { + print(error) + } + + let show = try jsonDecoder.decode(MDBShow.self, from: data) + + return show + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Trending.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Trending.swift new file mode 100644 index 00000000..5bb89280 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB+Trending.swift @@ -0,0 +1,35 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation +import Resty + +public extension MovieDB { + func trendingMovies() async throws -> [MDBTrendingMovie] { + let response = try await self.get(endpoint: MovieDatabaseEndpoint.trending(kind: .movie, period: .week)) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let movies = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return movies.results + } + + func trendingShows() async throws -> [MDBTrendingShow] { + let response = try await self.get(endpoint: MovieDatabaseEndpoint.trending(kind: .tv, period: .day)) + + guard let data = response.data else { + throw MovieDBError.emptyResults + } + + let movies = try jsonDecoder.decode(PaginatedResult.self, from: data) + + return movies.results + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB.swift new file mode 100644 index 00000000..db8a0fd1 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/MovieDB.swift @@ -0,0 +1,48 @@ +import Foundation +import Resty + +public final class MovieDB { + let resty = Resty() + let jsonDecoder = JSONDecoder() + let authorizationMode: AuthorizationMode + + var languageCode: String { + return Locale.current.language.languageCode?.identifier ?? "en" + } + + public init(authorization mode: AuthorizationMode) { + self.authorizationMode = mode + jsonDecoder.dateDecodingStrategy = .formatted(DateFormatter.movieDatabaseFormatter) + } + + public convenience init(apiKey value: String) { + self.init(authorization: .apiKey(key: value)) + } + + public convenience init(token bearer: String) { + self.init(authorization: .header(token: bearer)) + } + + internal func get(endpoint movieDBEndpoint: Endpoint, withParameters parameters: [QueryParameter]? = nil) async throws -> NetworkResponse { + var request = NetworkRequest() + + switch authorizationMode { + case .header(let token): + request.headers = [ + "Authorization" : "Bearer \(token)" + ] + case .apiKey(let key): + request.queryParameters = [ ApiQueryParameter.apiKey(value: key) ] + } + + // Default language + request.queryParameters = (request.queryParameters ?? []) + [ ApiQueryParameter.language(code: self.languageCode) ] + + // Request parameters + if let parameters { + request.queryParameters?.append(contentsOf: parameters) + } + + return try await resty.fetch(endpoint: movieDBEndpoint, withParameters: request) + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/ApiQueryParameter.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/ApiQueryParameter.swift new file mode 100644 index 00000000..1136e541 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/ApiQueryParameter.swift @@ -0,0 +1,33 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 3/1/23. +// + +import Foundation +import Resty + +enum ApiQueryParameter { + case apiKey(value: String) + case language(code: String) + case page(value: Int) + case search(term: String) +} + +extension ApiQueryParameter: QueryParameter { + var queryItem: URLQueryItem { + switch self { + case .apiKey(let value): + return URLQueryItem(name: "api_key", value: value) + case .language(let code): + return URLQueryItem(name: "language", value: code) + case .page(let value): + return URLQueryItem(name: "page", value: String(value)) + case .search(let term): + return URLQueryItem(name: "query", value: term) + } + } + + +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverParameter.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverParameter.swift new file mode 100644 index 00000000..8862b343 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverParameter.swift @@ -0,0 +1,50 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 9/1/23. +// + +import Foundation +import Resty + +enum DiscoverParameter { + case region(code: String) + case sort(by: SortField, ascendent: Bool) + case includeAdultContent(value: Bool) + case year(value: Int) + case withCasting(values: [String]) + case withCrew(values: [String]) + case genres(values: [Int]) + case primaryReleaseDate(date: Date, greaterThanThisDate: Bool) +} + +extension DiscoverParameter: QueryParameter { + var queryItem: URLQueryItem { + switch self { + case .region(let code): + return URLQueryItem(name: "region", value: code) + case .sort(let by, let ascendent): + let suffix = ascendent ? "asc" : "desc" + return URLQueryItem(name: "sort_by", value: "\(by.description).\(suffix)") + case .includeAdultContent(let value): + return URLQueryItem(name: "include_adult", value: "\(value ? "true" : "false")") + case .year(let value): + return URLQueryItem(name: "year", value: "\(value)") + case .withCasting(let values): + return URLQueryItem(name: "with_cast", value: values.joined(separator: ",")) + case .withCrew(let values): + return URLQueryItem(name: "with_crew", value: values.joined(separator: ",")) + case .genres(let values): + let genres = values.map({ "\($0)" }) + .joined(separator: ",") + + return URLQueryItem(name: "with_genres", value: genres) + case .primaryReleaseDate(let date, let greaterThanThisDate): + let suffix = greaterThanThisDate ? "gte" : "lte" + let dateValue = DateFormatter.movieDatabaseFormatter.string(from: date) + + return URLQueryItem(name: "primary_release_date.\(suffix)", value: dateValue) + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverShowParameter.swift b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverShowParameter.swift new file mode 100644 index 00000000..e2702b94 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Sources/MovieDB/Parameters/DiscoverShowParameter.swift @@ -0,0 +1,29 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 9/1/23. +// + +import Foundation +import Resty + +enum DiscoverShowParameter { + case status(value: ShowStatus) + case kind(value: ShowKind) + case runtime(greaterThan: Bool, time: Int) +} + +extension DiscoverShowParameter: QueryParameter { + var queryItem: URLQueryItem { + switch self { + case .status(let value): + return URLQueryItem(name: "with_status", value: "\(value.rawValue)") + case .kind(let value): + return URLQueryItem(name: "with_type", value: "\(value.rawValue)") + case .runtime(let greaterThan, let time): + let key = "with_runtime." + (greaterThan ? "gte" : "lte") + return URLQueryItem(name: key, value: "\(time)") + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/DiscoverTests.swift b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/DiscoverTests.swift new file mode 100644 index 00000000..e8a63670 --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/DiscoverTests.swift @@ -0,0 +1,38 @@ +// +// DiscoverTests.swift +// +// +// Created by Adolfo Vera Blasco on 10/1/23. +// + +import XCTest +@testable import MovieDB + +final class DiscoverTests: XCTestCase { + #warning("Copy your MovieDB API here 👇") + private let client = MovieDB(apiKey: "") + + func testDiscoverMovies() async { + do { + let movies = try await client.discoverMovies(sortedBy: .popularity) + print(movies) + + XCTAssertFalse(movies.isEmpty) + } catch let error { + print(error) + XCTFail(error.localizedDescription) + } + } + + func testDiscoverShows() async { + do { + let shows = try await client.discoverShows(sortedBy: .popularity) + print(shows) + + XCTAssertFalse(shows.isEmpty) + } catch let error { + print(error) + XCTFail(error.localizedDescription) + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/GenresTests.swift b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/GenresTests.swift new file mode 100644 index 00000000..34b3525e --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/GenresTests.swift @@ -0,0 +1,31 @@ +import XCTest +@testable import MovieDB + +final class GenresTests: XCTestCase { + #warning("Copy your MovieDB API here 👇") + private let client = MovieDB(apiKey: "") + + func testMovieGenres() async { + do { + let genres = try await client.genres(for: .movie) + print(genres) + + XCTAssertFalse(genres.isEmpty) + } catch let error { + print(error) + XCTFail(error.localizedDescription) + } + } + + func testTVGenres() async { + do { + let genres = try await client.genres(for: .tv) + print(genres) + + XCTAssertFalse(genres.isEmpty) + } catch let error { + print(error) + XCTFail(error.localizedDescription) + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/MovieDBTests.swift b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/MovieDBTests.swift new file mode 100644 index 00000000..08f05acc --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/MovieDBTests.swift @@ -0,0 +1,31 @@ +import XCTest +@testable import MovieDB + +final class MovieDBTests: XCTestCase { + #warning("Copy your MovieDB API here 👇") + private let client = MovieDB(apiKey: "") + + func testTrendingMovies() async { + do { + let movies = try await client.trendingMovies() + print(movies) + XCTAssertFalse(movies.isEmpty) + XCTAssertEqual(movies.count, 20) + } catch let error { + print("🚨 \(error)") + XCTFail(error.localizedDescription) + } + } + + func testTrendingShows() async { + do { + let shows = try await client.trendingShows() + print(shows) + XCTAssertFalse(shows.isEmpty) + XCTAssertEqual(shows.count, 20) + } catch let error { + print("🚨 \(error)") + XCTFail(error.localizedDescription) + } + } +} diff --git a/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/ShowTests.swift b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/ShowTests.swift new file mode 100644 index 00000000..17ca90dc --- /dev/null +++ b/Examples/GlobantPlus/App/MovieDB/Tests/MovieDBTests/ShowTests.swift @@ -0,0 +1,56 @@ +// +// ShowTests.swift +// +// +// Created by Adolfo Vera Blasco on 6/3/23. +// + +import XCTest +@testable import MovieDB + +final class ShowTests: XCTestCase { + #warning("Copy your MovieDB API here 👇") + private let client = MovieDB(apiKey: "") + + private let shows = [ + 1399, // Juego de Tronos + 73586, // Yellowstone + 66732, // Stranger Things + 100088, // The Last of Us + 153312, // Tulsa King + 456, // The Simpsons + 5920, // El Mentalista + 76479, // The Boys + 78191, // You + 215333, // La chica de nieve + 4586, // Las chicas Gilmore + 4604, // Smallville + 31586, // La Reina del Sur + 1421, // Modern Family + 46260, // Naruto + 31132, // Historias corrientes + 1419, // Castle + 37606, // Gumball + 124364, // From + 1418, // The Big Bang Theory + 95403, // The Peripheral + 90669, // 1899 + 1100, // Como conocí a vuestra madre + 126725 // Velma + ] + + func testShow() async { + for showId in shows { + do { + let show = try await client.showDetails(showId: showId) + + XCTAssertFalse(show.title.isEmpty) + XCTAssertEqual(showId, show.id) + } catch let error { + print(showId) + print(error) + XCTFail(error.localizedDescription) + } + } + } +} diff --git a/Examples/GlobantPlus/App/Resty/.gitignore b/Examples/GlobantPlus/App/Resty/.gitignore new file mode 100644 index 00000000..3b298120 --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Examples/GlobantPlus/App/Resty/Package.swift b/Examples/GlobantPlus/App/Resty/Package.swift new file mode 100644 index 00000000..5cf65a03 --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "Resty", + platforms: [ + .tvOS(.v16) + ], + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "Resty", + type: .dynamic, + targets: ["Resty"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "Resty", + dependencies: []), + .testTarget( + name: "RestyTests", + dependencies: ["Resty"]), + ] +) diff --git a/Examples/GlobantPlus/App/Resty/README.md b/Examples/GlobantPlus/App/Resty/README.md new file mode 100644 index 00000000..d7b562be --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/README.md @@ -0,0 +1,3 @@ +# Resty + +Una pequeña librería de red escrita en Swift. diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/Endpoint.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/Endpoint.swift new file mode 100644 index 00000000..9b3bdf71 --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/Endpoint.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol Endpoint { + var path: String { get } +} diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkError.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkError.swift new file mode 100644 index 00000000..095c166a --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkError.swift @@ -0,0 +1,13 @@ +import Foundation + +public enum NetworkError: Error { + case malformedRequest + case badRequest + case unauthorized + case forbidden + case notFound + case internalError + case serviceUnavailable + case jsonDecode + case backendError(code: Int) +} diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkRequest.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkRequest.swift new file mode 100644 index 00000000..88cb71ec --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkRequest.swift @@ -0,0 +1,50 @@ +import Foundation + +public struct NetworkRequest { + public enum HttpMethod: String { + case get = "GET" + case post = "POST" + case put = "PUT" + case patch = "PATCH" + case delete = "DELETE" + } + + public var queryParameters: [QueryParameter]? + public var headers: [String : String]? + public var payload: Data? + public var method: NetworkRequest.HttpMethod = .get + + public init(parameters: [QueryParameter]? = nil, httpHeaders: [String : String]? = nil, body payload: Data? = nil, httpMethod: NetworkRequest.HttpMethod = .get) { + self.queryParameters = parameters + self.headers = httpHeaders + self.payload = payload + self.method = httpMethod + } + + func makeURLRequest(for endpoint: Endpoint) -> URLRequest? { + guard let url = URL(string: endpoint.path), + var components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return nil } + + if let parameters = queryParameters, !parameters.isEmpty { + components.queryItems = parameters.map({ $0.queryItem }) + } + + guard let url = components.url else { + return nil + } + + var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData) + + if let headers = headers { + headers.forEach({ request.addValue($0.value, forHTTPHeaderField: $0.key) }) + } + + if let body = payload { + request.httpBody = body + } + + request.httpMethod = self.method.rawValue + + return request + } +} diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkResponse.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkResponse.swift new file mode 100644 index 00000000..b2c35f5f --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/NetworkResponse.swift @@ -0,0 +1,13 @@ +import Foundation + +public struct NetworkResponse { + public private(set) var data: Data? + public private(set) var headers: [AnyHashable : Any]? + public private(set) var httpCodeResponse: Int + + init(withCode httpCode: Int, results data: Data? = nil, headers: [AnyHashable : Any]? = nil) { + self.httpCodeResponse = httpCode + self.data = data + self.headers = headers + } +} diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/QueryParameter.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/QueryParameter.swift new file mode 100644 index 00000000..b73a04ff --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Model/QueryParameter.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol QueryParameter { + var queryItem: URLQueryItem { get } +} diff --git a/Examples/GlobantPlus/App/Resty/Sources/Resty/Resty.swift b/Examples/GlobantPlus/App/Resty/Sources/Resty/Resty.swift new file mode 100644 index 00000000..72d134d7 --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Sources/Resty/Resty.swift @@ -0,0 +1,59 @@ +import Foundation + +public final class Resty { + private let httpSession: URLSession + + public init() { + self.httpSession = URLSession.shared + } + + public func fetch(endpoint: Endpoint) async throws -> NetworkResponse { + let parameters = NetworkRequest(httpMethod: .get) + return try await self.fetch(endpoint: endpoint, withParameters: parameters) + } + + public func fetch(endpoint: Endpoint, withParameters parameter: NetworkRequest) async throws -> NetworkResponse { + guard let request = parameter.makeURLRequest(for: endpoint) else { + throw NetworkError.malformedRequest + } + + let response = try await self.processRequest(request) + + return response + } + + private func processRequest(_ request: URLRequest) async throws -> NetworkResponse { + let (data, response) = try await self.httpSession.data(for: request) + + guard let httpResponse = response as? HTTPURLResponse else { + throw NetworkError.badRequest + } + + let apiResponse = try processResponse(httpResponse, data: data) + + return apiResponse + } + + private func processResponse(_ httpResponse: HTTPURLResponse, data: Data) throws -> NetworkResponse { + switch httpResponse.statusCode { + case 400: + throw NetworkError.badRequest + case 401: + throw NetworkError.unauthorized + case 403: + throw NetworkError.forbidden + case 404: + throw NetworkError.notFound + case 500: + throw NetworkError.internalError + case 503: + throw NetworkError.serviceUnavailable + default: + let apiResponse = NetworkResponse(withCode: httpResponse.statusCode, + results: data, + headers: httpResponse.allHeaderFields) + + return apiResponse + } + } +} diff --git a/Examples/GlobantPlus/App/Resty/Tests/RestyTests/RestyTests.swift b/Examples/GlobantPlus/App/Resty/Tests/RestyTests/RestyTests.swift new file mode 100644 index 00000000..cbf0903c --- /dev/null +++ b/Examples/GlobantPlus/App/Resty/Tests/RestyTests/RestyTests.swift @@ -0,0 +1,11 @@ +import XCTest +@testable import Resty + +final class RestyTests: XCTestCase { + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(Resty().text, "Hello, World!") + } +} diff --git a/Examples/GlobantPlus/App/build/XCBuildData/BuildDescriptionCacheIndex-27a888faf0f708a1c72fe2946c0f2608 b/Examples/GlobantPlus/App/build/XCBuildData/BuildDescriptionCacheIndex-27a888faf0f708a1c72fe2946c0f2608 new file mode 100644 index 00000000..fc739ad9 Binary files /dev/null and b/Examples/GlobantPlus/App/build/XCBuildData/BuildDescriptionCacheIndex-27a888faf0f708a1c72fe2946c0f2608 differ diff --git a/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-buildRequest.json b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-buildRequest.json new file mode 100644 index 00000000..0146187d --- /dev/null +++ b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-buildRequest.json @@ -0,0 +1,41 @@ +{ + "_buildCommand2" : { + "command" : "build", + "skipDependencies" : false, + "style" : "buildAndRun" + }, + "buildCommand" : "build", + "configuredTargets" : [ + { + "guid" : "438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd" + } + ], + "containerPath" : "/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus.xcodeproj", + "continueBuildingAfterErrors" : false, + "enableIndexBuildArena" : false, + "hideShellScriptEnvironment" : false, + "parameters" : { + "action" : "build", + "overrides" : { + "commandLine" : { + "table" : { + + } + }, + "synthesized" : { + "table" : { + "ACTION" : "build", + "COLOR_DIAGNOSTICS" : "YES", + "diagnostic_message_length" : "120", + "ENABLE_PREVIEWS" : "NO" + } + } + } + }, + "schemeCommand" : "launch", + "showNonLoggedProgress" : true, + "useDryRun" : false, + "useImplicitDependencies" : false, + "useLegacyBuildLocations" : false, + "useParallelTargets" : true +} \ No newline at end of file diff --git a/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-desc.xcbuild b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-desc.xcbuild new file mode 100644 index 00000000..67f2cf7d Binary files /dev/null and b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-desc.xcbuild differ diff --git a/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-manifest.xcbuild b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-manifest.xcbuild new file mode 100644 index 00000000..2925a0fb --- /dev/null +++ b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-manifest.xcbuild @@ -0,0 +1 @@ +{"client":{"name":"basic","version":0,"file-system":"device-agnostic"},"targets":{"":[""]},"nodes":{"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build":{"is-mutated":true},"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos":{"is-mutated":true},"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"is-mutated":true},"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus":{"is-mutated":true},"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs":{"is-mutated":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true},"":{"is-command-timestamp":true}},"commands":{"":{"tool":"phony","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/_CodeSignature","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs","","","","",""],"outputs":[""]},"":{"tool":"stale-file-removal","expectedOutputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/_CodeSignature","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Assets.car","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PremiereCoreData.momd","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PkgInfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList"],"roots":["/tmp/GlobantPlus.dst","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build"],"outputs":[""]},"P0:::CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build":{"tool":"create-build-directory","description":"CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build","inputs":[],"outputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build"]},"P0:::CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos":{"tool":"create-build-directory","description":"CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build"],"outputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos"]},"P0:::CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs":{"tool":"create-build-directory","description":"CreateBuildDirectory /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build"],"outputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::CodeSign /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"shell","description":"CodeSign /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/ApplicationEnvironment.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/GlobantPlusApp.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Info.plist/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Extensions/Int+Runtime.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataDeleteFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFetchFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataInsertFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/CoraDataStorage.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/StorageSettings.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Genre.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/PremiereError.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Show.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/TrendingItem.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/DashboardRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/DeleteFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/FetchFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/InsertFavoriteRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/ShowRepository.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultDashboardUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Resources/Assets.xcassets/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Navigation/DashboardNavigationManager.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content/Preview Assets.xcassets/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent/","","","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/_CodeSignature","",""],"args":["/usr/bin/codesign","--force","--sign","25A9017E432D7EDA03F5CD54BAD720881DAA92BF","--entitlements","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","--timestamp=none","--generate-entitlement-der","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app"],"env":{"CODESIGN_ALLOCATE":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"},"can-safely-interrupt":false,"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","signature":"ea6fe9c2c07d9fe0baa4a79ea2f55e47"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::CompileAssetCatalog /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content/Preview Assets.xcassets /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Resources/Assets.xcassets":{"tool":"shell","description":"CompileAssetCatalog /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content/Preview Assets.xcassets /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Resources/Assets.xcassets","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content/Preview Assets.xcassets/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Resources/Assets.xcassets/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Assets.car"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/actool","--output-format","human-readable-text","--notices","--warnings","--export-dependency-info","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_dependencies","--output-partial-info-plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","--app-icon","App Icon & Top Shelf Image","--accent-color","AccentColor","--compress-pngs","--enable-on-demand-resources","YES","--development-region","en","--leaderboard-identifier-prefix","GlobantPlus.game-center.leaderboard.","--leaderboard-set-identifier-prefix","GlobantPlus.game-center.leaderboard-set.","--target-device","tv","--minimum-deployment-target","16.1","--platform","appletvos","--compile","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content/Preview Assets.xcassets","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Resources/Assets.xcassets"],"env":{},"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","control-enabled":false,"deps":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_dependencies"],"deps-style":"dependency-info","signature":"15dc674b9ab23ffe4b11d23e3091a4bc"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::CopyPlistFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Info.plist":{"tool":"copy-plist","description":"CopyPlistFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Info.plist","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Info.plist","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::CopySwiftLibs /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"embed-swift-stdlib","description":"CopySwiftLibs /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus","","",""],"outputs":[""],"deps":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/SwiftStdLibToolInputDependencies.dep"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::CpResource /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig":{"tool":"file-copy","description":"CpResource /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/Configuration/AppConfig.xcconfig/","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::DataModelCompile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/ /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld":{"tool":"shell","description":"DataModelCompile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/ /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld/","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PremiereCoreData.momd"],"args":["/Applications/Xcode.app/Contents/Developer/usr/bin/momc","--sdkroot","/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS16.1.sdk","--appletvos-deployment-target","16.1","--module","GlobantPlus","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Model/PremiereCoreData.xcdatamodeld","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/"],"env":{},"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","control-enabled":false,"signature":"7ed7016d7639a0a5f2c9c6c0f6472613"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ExtractAppIntentsMetadata":{"tool":"appintents-metadata","description":"ExtractAppIntentsMetadata","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/DeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/GlobantPlusApp.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/CoraDataStorage.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/FetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/ApplicationEnvironment.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataDeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Extensions/Int+Runtime.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/InsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/DashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Genre.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultDashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Show.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/StorageSettings.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataInsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Navigation/DashboardNavigationManager.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/ShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/TrendingItem.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/PremiereError.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","","",""],"outputs":[""]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::MkDir /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"mkdir","description":"MkDir /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","",""]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ProcessInfoPlistFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/Application/Info.plist":{"tool":"info-plist-processor","description":"ProcessInfoPlistFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/Application/Info.plist","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/Application/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PkgInfo"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ProcessProductPackaging /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent":{"tool":"process-product-entitlements","description":"ProcessProductPackaging /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ProcessProductPackaging /Users/adolfo/Library/MobileDevice/Provisioning Profiles/7f5a939a-e34a-459c-a333-a35fc08bf0b3.mobileprovision /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision":{"tool":"process-product-provisioning-profile","description":"ProcessProductPackaging /Users/adolfo/Library/MobileDevice/Provisioning Profiles/7f5a939a-e34a-459c-a333-a35fc08bf0b3.mobileprovision /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision","inputs":["/Users/adolfo/Library/MobileDevice/Provisioning Profiles/7f5a939a-e34a-459c-a333-a35fc08bf0b3.mobileprovision","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ProcessProductPackagingDER /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der":{"tool":"shell","description":"ProcessProductPackagingDER /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der"],"args":["/usr/bin/derq","query","-f","xml","-i","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","-o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","--raw"],"env":{},"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","signature":"2471721042d2285fbb3a797d62a388e9"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::RegisterExecutionPolicyException /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","","",""],"outputs":[""]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::SwiftDriver Compilation GlobantPlus normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation","description":"SwiftDriver Compilation GlobantPlus normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/DeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/GlobantPlusApp.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/CoraDataStorage.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/FetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/ApplicationEnvironment.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataDeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Extensions/Int+Runtime.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/InsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/DashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Genre.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultDashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Show.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/StorageSettings.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataInsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Navigation/DashboardNavigationManager.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/ShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/TrendingItem.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/PremiereError.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.stringsdata"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Touch /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"shell","description":"Touch /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","","",""],"outputs":[""],"args":["/usr/bin/touch","-c","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app"],"env":{},"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","signature":"28686df36d71cd0040f1551890ef1e39"},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Validate /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app":{"tool":"validate-product","description":"Validate /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app","inputs":["","","",""],"outputs":[""]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::ValidateDevelopmentAssets /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build":{"tool":"validate-development-assets","description":"ValidateDevelopmentAssets /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Preview Content",""],"outputs":[""],"allow-missing-inputs":true},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList"]},"P0:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo":{"tool":"file-copy","description":"Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo/","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json":{"tool":"file-copy","description":"Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json/","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc":{"tool":"file-copy","description":"Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc/","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule":{"tool":"file-copy","description":"Copy /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule/","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Ld /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus normal":{"tool":"shell","description":"Ld /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus normal","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-target","arm64-apple-tvos16.1","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS16.1.sdk","-L/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs","-L/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos","-F/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/EagerLinkingTBDs","-F/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos","-filelist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList","-Xlinker","-rpath","-Xlinker","@executable_path/Frameworks","-dead_strip","-Xlinker","-object_path_lto","-Xlinker","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_lto.o","-Xlinker","-export_dynamic","-Xlinker","-no_deduplicate","-fobjc-link-runtime","-L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/appletvos","-L/usr/lib/swift","-Xlinker","-add_ast_path","-Xlinker","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","-Xlinker","-no_adhoc_codesign","-Xlinker","-dependency_info","-Xlinker","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","-o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/GlobantPlus"],"env":{},"working-directory":"/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App","deps":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat"],"deps-style":"dependency-info","signature":"ac0af2f42f2e63eedec4ad3a741b3bcf"},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::SwiftDriver Compilation Requirements GlobantPlus normal arm64 com.apple.xcode.tools.swift.compiler":{"tool":"swift-driver-compilation-requirement","description":"SwiftDriver Compilation Requirements GlobantPlus normal arm64 com.apple.xcode.tools.swift.compiler","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/DeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/SQSActivityQueue.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/GlobantPlusApp.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Trackable.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/CoraDataStorage.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/DefaultShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/FetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Application/ApplicationEnvironment.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataDeleteFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Dashboard/TMDBDashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Extensions/Int+Runtime.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Model/DashboardView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataFetchFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DefaultDashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataProperties.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/FavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/ViewModel/ShowViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Queues/AmazonSQS/Model/SQSActivity.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Show/TMDBShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/View/DashboardView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/Favorires/InsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/Model/ShowView+Model.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Show/View/ShowView.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/DashboardRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Genre.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Dashboard/DefaultDashboardUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Favorites/DefaultFavoriteUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/Entities/PCDFavorite+CoreDataClass.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/Show.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/DefaultShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Storage/StorageSettings.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Data/Repositories/Favorites/CoreDataInsertFavoriteRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/Navigation/DashboardNavigationManager.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Repositories/ShowRepository.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/TrendingItem.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/UseCases/Show/ShowUseCase.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Presentation/Scenes/Dashboard/ViewModel/DashboardViewModel.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/GlobantPlus/Domain/Model/PremiereError.swift","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","","",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::SwiftMergeGeneratedHeaders /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h":{"tool":"swift-header-tool","description":"SwiftMergeGeneratedHeaders /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","inputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h"]},"P1:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList":{"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList","inputs":["",""],"outputs":["/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList"]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--AppIntentsMetadataTaskProducer":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-ChangeAlternatePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-ChangePermissions":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-CodeSign":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-CopyAside":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-RegisterExecutionPolicyException":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-RegisterProduct":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-StripSymbols":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--Barrier-Validate":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--CopySwiftPackageResourcesTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--DocumentationTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--GeneratedFilesTaskProducer":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist"],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--HeadermapTaskProducer":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml"],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--InfoPlistTaskProducer":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PkgInfo"],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--ModuleMapTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--ProductPostprocessingTaskProducer":{"tool":"phony","inputs":["","","","","","","","","","","","","","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--ProductStructureTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--SanitizerTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--StubBinaryTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--SwiftABIBaselineGenerationTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--SwiftFrameworkABICheckerTaskProducer":{"tool":"phony","inputs":["","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--SwiftStandardLibrariesTaskProducer":{"tool":"phony","inputs":["","","",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--TAPISymbolExtractorTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--TestHostTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--TestTargetPostprocessingTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--TestTargetTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--VersionPlistTaskProducer":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--copy-headers-completion":{"tool":"phony","inputs":[""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--fused-phase0-compile-sources&link-binary©-bundle-resources":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Assets.car","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PremiereCoreData.momd","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList"],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--generated-headers":{"tool":"phony","inputs":[""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--package-copy-files-phase":{"tool":"phony","inputs":["",""],"outputs":[""]},"P2:::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--swift-generated-headers":{"tool":"phony","inputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h"],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--begin-compiling":{"tool":"phony","inputs":["","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--begin-linking":{"tool":"phony","inputs":["","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--begin-scanning":{"tool":"phony","inputs":["","","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--end":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/assetcatalog_generated_info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Assets.car","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/AppConfig.xcconfig","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PremiereCoreData.momd","","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/Info.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PkgInfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.stringsdata","","","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-non-framework-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-all-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-generated-files.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-own-target-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus-project-headers.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.hmap","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/all-product-headers.yaml","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--entry":{"tool":"phony","inputs":["","","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--immediate":{"tool":"phony","inputs":["","","","","",""],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--linker-inputs-ready":{"tool":"phony","inputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList"],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--modules-ready":{"tool":"phony","inputs":["","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h"],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--unsigned-product-ready":{"tool":"phony","inputs":["","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/PremiereCoreData.momd","","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.app/embedded.mobileprovision","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/GlobantPlus.app.xcent.der","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.o","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivityQueue.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlusApp.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Trackable.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoraDataStorage.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ApplicationEnvironment.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataDeleteFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBDashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Int+Runtime.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataFetchFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataProperties.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/FavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/SQSActivity.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TMDBShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/InsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView+Model.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowView.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Genre.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultDashboardUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultFavoriteUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PCDFavorite+CoreDataClass.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/Show.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DefaultShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/StorageSettings.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/CoreDataInsertFavoriteRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardNavigationManager.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowRepository.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/TrendingItem.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/ShowUseCase.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/DashboardViewModel.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/PremiereError.stringsdata","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/Entitlements.plist","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-OutputFileMap.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.SwiftFileList","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/Project/arm64-apple-tvos.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/Debug-appletvos/GlobantPlus.swiftmodule/arm64-apple-tvos.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus_dependency_info.dat","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus Swift Compilation Requirements Finished","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftmodule","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftsourceinfo","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.abi.json","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.swiftdoc","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/DerivedSources/GlobantPlus-Swift.h","/Users/adolfo/Documents/Globant/AWS Lambda Tech Talk/App/build/GlobantPlus.build/Debug-appletvos/GlobantPlus.build/Objects-normal/arm64/GlobantPlus.LinkFileList"],"outputs":[""]},"P2:target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd-::Gate target-GlobantPlus-438b28aaa82d1ea03198343e3649434db0dd62d88ec028a4ea7b339b36b266bd--will-sign":{"tool":"phony","inputs":[""],"outputs":[""]}}} \ No newline at end of file diff --git a/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-targetGraph.txt b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-targetGraph.txt new file mode 100644 index 00000000..d0cf4c3e --- /dev/null +++ b/Examples/GlobantPlus/App/build/XCBuildData/b0eb568893e32ca3805300a1df9ac5d5-targetGraph.txt @@ -0,0 +1,2 @@ +Target dependency graph (1 target) +GlobantPlus in GlobantPlus, no dependencies \ No newline at end of file diff --git a/Examples/GlobantPlus/App/build/XCBuildData/build.db b/Examples/GlobantPlus/App/build/XCBuildData/build.db new file mode 100644 index 00000000..5bed4c49 Binary files /dev/null and b/Examples/GlobantPlus/App/build/XCBuildData/build.db differ diff --git a/Examples/GlobantPlus/Documentation/GlobantPlus-App-EN.md b/Examples/GlobantPlus/Documentation/GlobantPlus-App-EN.md new file mode 100644 index 00000000..6eda72c1 --- /dev/null +++ b/Examples/GlobantPlus/Documentation/GlobantPlus-App-EN.md @@ -0,0 +1,28 @@ +# GlobantPlus - Globant's Fictional Streaming Service + +This app serves as a thread to showcase the use of Swift for developing AWS Lambdas and how we can use them from applications developed for Apple devices, in this case for an AppleTV. + +## What is GlobantPlus? + +It is an tvOS application that displays the catalog of Globant's fictional streaming service. + +It has only two scenes, a dashboard where you can see trends in series, movies, and documentaries, and a detailed view of the series. + +It is important to note that the purpose of the application is to showcase the use of AWS services from an app, so aspects such as dependency injection or the creation of the AWS session for the Soto framework have been adapted to better show the workflow with those services. + +## AWS Services + +The AWS services we are going to use from the app are the following: + +* AWS API Gateway: When we add or remove a series from our *Favorites*, we will invoke an endpoint defined in the API Gateway. The code can be found in `GlobantPlus > Data > Network > AmazonAPI`. + +* AWS SQS: To track user activity within the application, we will send data to the AWS message queue service. The code can be found in `GlobantPlus > Data > Queues > AmazonSQS`. + +## Frameworks + +To work with AWS services, we use the [Soto](https://github.com/soto-project/soto) package. + +## Contact + +* [GitHub](https://github.com/fitomad) +* [LinkedIn](https://www.linkedin.com/in/adolfo-vera) \ No newline at end of file diff --git a/Examples/GlobantPlus/Documentation/GlobantPlus-App.md b/Examples/GlobantPlus/Documentation/GlobantPlus-App.md new file mode 100644 index 00000000..41d4d6b4 --- /dev/null +++ b/Examples/GlobantPlus/Documentation/GlobantPlus-App.md @@ -0,0 +1,28 @@ +# GlobantPlus - El servicio ficticio de Streaming de Globant + +Esta app sirve como hilo conductor a la hora de mostrar el uso de Swift para desarrollar AWS Lambdas y como podemos usarlas desde aplicaciones desarrolladas para dispositivos Apple, en este caso para un AppleTV. + +## ¿Qué es GlobantPlus? + +Es una aplicación para tvOS que muestra el catálago del servicio ficticio de streaming de Globant. + +Sólo tiene dos escenas, un dashboard donde se pueden ver las tendencias de series, películas y documentales, y una vista detallada de las series. + +Hay que tener en cuenta que la finalidad de la aplicación es mostrar el uso de los servicios de AWS desde una app, por lo que aspector como la inyección de dependencias, o la creación de la sesión AWS del framework Soto se han adaptado para mostrar con mayor claridad el flujo de trabajo con esos servicios. + +## Servicios AWS + +Los servicios AWS que vamos a usar desde la app son los siguientes: + +* **AWS API Gateway**: Cuando añadamos o eliminemos una serie de nuestros *Favoritos* invocaremos un endpoint definido en el API Gateway. El código se puede encontrar en `GlobantPlus > Data > Network > AmazonAPI` + +* **AWS SQS**: Para obtener un seguimiento de la actividad del usuario dentro de al aplicación enviaremos los datos al servicio de cola de mensajes de AWS. El código se puede encontrar en `GlobantPlus > Data > Queues > AmazonSQS` + +## Frameworks + +Para poder trabajar con los servicios de AWS se usa el paquete [Soto](https://github.com/soto-project/soto). + +## Contacto + +* [GitHub](https://github.com/fitomad) +* [LinkedIn](https://www.linkedin.com/in/adolfo-vera) \ No newline at end of file diff --git a/Examples/GlobantPlus/Documentation/Images/Docker.png b/Examples/GlobantPlus/Documentation/Images/Docker.png new file mode 100644 index 00000000..daf492ab Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/Docker.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/GlobantPlus-App.png b/Examples/GlobantPlus/Documentation/Images/GlobantPlus-App.png new file mode 100644 index 00000000..56be7ae0 Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/GlobantPlus-App.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/Lambda-Paquete.png b/Examples/GlobantPlus/Documentation/Images/Lambda-Paquete.png new file mode 100644 index 00000000..43b866d0 Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/Lambda-Paquete.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/Remove-Derived-Data.png b/Examples/GlobantPlus/Documentation/Images/Remove-Derived-Data.png new file mode 100644 index 00000000..ef4a8b84 Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/Remove-Derived-Data.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/XCConfig-Xcode.png b/Examples/GlobantPlus/Documentation/Images/XCConfig-Xcode.png new file mode 100644 index 00000000..9fae4a1e Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/XCConfig-Xcode.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/aws-console.png b/Examples/GlobantPlus/Documentation/Images/aws-console.png new file mode 100644 index 00000000..cb5c71ea Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/aws-console.png differ diff --git a/Examples/GlobantPlus/Documentation/Images/tmdb.png b/Examples/GlobantPlus/Documentation/Images/tmdb.png new file mode 100644 index 00000000..f1bf08a9 Binary files /dev/null and b/Examples/GlobantPlus/Documentation/Images/tmdb.png differ diff --git a/Examples/GlobantPlus/Documentation/Lambdas-EN.md b/Examples/GlobantPlus/Documentation/Lambdas-EN.md new file mode 100644 index 00000000..c3bc0731 --- /dev/null +++ b/Examples/GlobantPlus/Documentation/Lambdas-EN.md @@ -0,0 +1,36 @@ +# Compiling Lambdas with Swift + +We must open the **Console** application and navigate to the folder with the Swift Package that we want to compile and generate its package, then execute the following command + +```zsh +swift package --disable-sandbox archive +``` + +If we want the package to be generated in a specific path, we should use the `--output-path` parameter. + +```zsh +swift package --disable-sandbox archive --output-path /Users/JohnAppleseed/Desktop --verbose 2 +``` + +The verbose parameter sets the level of detail of the log that appears on the screen with the result of the operation. + +For more detailed information on the parameters accepted by the new archive command, visit the [Deploy to AWS Lambda](https://github.com/swift-server/swift-aws-lambda-runtime#deploying-to-aws-lambda) section of the [Swift AWS Lambda runtime](https://github.com/swift-server/swift-aws-lambda-runtime) project. + +## Preparations + +Since AWS Lambda functions run on an [Amazon Linux 2](https://aws.amazon.com/es/amazon-linux-2/?amazon-linux-whats-new.sort-by=item.additionalFields.postDateTime&amazon-linux-whats-new.sort-order=desc) system, packaging Lambda functions involves compiling the source code in a Docker image of that operating system. + +![Docker con Amazon Linux 2](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/Docker.png) + +Thanks to the `archive` plugin present since version 1 of the **Swift AWS Lambda runtime**, the management of this image is done transparently for us. We only need to have the Docker client installed and running while we compile and package. + +## Operation result + +Once the package has been generated, we can upload our Lambda function to AWS. To do this, we must go to the folder where we indicated the package should be generated and select the `zip` file. + +![Terminal-Empaquetado](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/Lambda-Paquete.png) + +## Contact + +* [GitHub](https://github.com/fitomad) +* [LinkedIn](https://www.linkedin.com/in/adolfo-vera) \ No newline at end of file diff --git a/Examples/GlobantPlus/Documentation/Lambdas.md b/Examples/GlobantPlus/Documentation/Lambdas.md new file mode 100644 index 00000000..6aac7b18 --- /dev/null +++ b/Examples/GlobantPlus/Documentation/Lambdas.md @@ -0,0 +1,34 @@ +# Compilación de Lambas con Swift + +Debemos abrir la aplicación **Terminal** y situarnos en la carpeta con el Swift Package que queremos compilar y generar su paquete y ejecutar el siguiente comando. + +```zsh +swift package --disable-sandbox archive +``` + +Si queremos que el empaquetedo se genere en una ruta determinada se debe usar el parámetro `--output-path` + +```zsh +swift package --disable-sandbox archive --output-path /Users/JohnAppleseed/Desktop --verbose 2 +``` + +El parámetro `verbose` establece el nivel de detalle del log que sale por pantalla con el resultado de la operación + +Para una información más detallada sobre los parámetros que acepta el nuevo comando `archive` visita la sección [Deploy to AWS Lambda](https://github.com/swift-server/swift-aws-lambda-runtime#deploying-to-aws-lambda) del proyecto [Swift AWS Lambda runtime](https://github.com/swift-server/swift-aws-lambda-runtime) + +## Preparativos previos + +Debido a que las funciones AWS Lambda se ejecutan sobre un sistema [Amazon Linux 2](https://aws.amazon.com/es/amazon-linux-2/?amazon-linux-whats-new.sort-by=item.additionalFields.postDateTime&amazon-linux-whats-new.sort-order=desc), el empaquetado de las funciones Lambda se hace compilando el código fuente en una imagen Docker de dicho sistema operativo. + +![Docker con Amazon Linux 2](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/Docker.png) + +Gracias al plugin `archive` presente desde la versión 1 de **Swift AWS Lamnda runtime** la gestión de dicha imagen se hace de forma transparente para nosotros, sólo es necesario tener instalado el cliente de Docker y ejecutándose mientras se realiza la compilación y empaquetado. + +## Resultado de la operación + +Una vez que se ha generado el paquete ya podemos cargar nuestra función Lambda en AWS. Para ello debemos ir a la carpeta donde hemos indicado que se genere el paquete y seleccionar el archivo `zip` + +![Terminal-Empaquetado](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/Lambda-Paquete.png) + +* [GitHub](https://github.com/fitomad) +* [LinkedIn](https://www.linkedin.com/in/adolfo-vera) diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Package.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Package.swift new file mode 100644 index 00000000..d41951ef --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Package.swift @@ -0,0 +1,30 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "AWSLambdaBackend", + platforms: [ + .macOS(.v12) + ], + dependencies: [ + .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha.1"), + .package(url: "https://github.com/swift-server/swift-aws-lambda-events.git", branch: "main"), + .package(url: "https://github.com/soto-project/soto.git", exact: "6.5.0") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .executableTarget( + name: "Favorites", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"), + .product(name: "AWSLambdaEvents", package: "swift-aws-lambda-events"), + .product(name: "SotoDynamoDB", package: "soto") + ]), + .testTarget( + name: "FavoritesTests", + dependencies: ["Favorites"]), + ] +) diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/README.md b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/README.md new file mode 100644 index 00000000..2d89a845 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/README.md @@ -0,0 +1,55 @@ +# AWSLambdaBackend + +A description of this package. + +```bash +swift package --disable-sandbox archive --output-path /Users/adolfo/Desktop --verbose 2 +``` + +Security Lambda DynamoDB + +https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_lambda-access-dynamodb.html + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "ReadWriteTable", + "Effect": "Allow", + "Action": [ + "dynamodb:BatchGetItem", + "dynamodb:GetItem", + "dynamodb:Query", + "dynamodb:Scan", + "dynamodb:BatchWriteItem", + "dynamodb:PutItem", + "dynamodb:UpdateItem", + "dynamodb:DeleteItem" + ], + "Resource": "arn:aws:dynamodb:*:*:table/favorites" + }, + { + "Sid": "GetStreamRecords", + "Effect": "Allow", + "Action": "dynamodb:GetRecords", + "Resource": "arn:aws:dynamodb:*:*:table/favorites/stream/* " + }, + { + "Sid": "WriteLogStreamsAndGroups", + "Effect": "Allow", + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Resource": "*" + }, + { + "Sid": "CreateLogGroup", + "Effect": "Allow", + "Action": "logs:CreateLogGroup", + "Resource": "*" + } + ] +} +``` diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteCommand.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteCommand.swift new file mode 100644 index 00000000..5c8c16d0 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteCommand.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +protocol FavoriteCommand { + func execute() throws +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteDELETECommand.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteDELETECommand.swift new file mode 100644 index 00000000..9dbf17a3 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoriteDELETECommand.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +final class FavoriteDELETECommand: FavoriteCommand { + private let deleteRepository: DeleteRepository + private let favoriteParameter: Favorite + + init(parameter: Favorite, repository: DeleteRepository) { + self.favoriteParameter = parameter + self.deleteRepository = repository + } + + func execute() throws { + try deleteRepository.delete(self.favoriteParameter) + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoritePOSTCommand.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoritePOSTCommand.swift new file mode 100644 index 00000000..47187e43 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Commands/FavoritePOSTCommand.swift @@ -0,0 +1,22 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +final class FavoritePOSTCommand: FavoriteCommand { + private let insertRepository: InsertRepository + private let favoriteParameter: Favorite + + init(parameter: Favorite, repository: InsertRepository) { + self.favoriteParameter = parameter + self.insertRepository = repository + } + + func execute() throws { + try insertRepository.insert(self.favoriteParameter) + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DeleteRepository.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DeleteRepository.swift new file mode 100644 index 00000000..35e8c9e5 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DeleteRepository.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +protocol DeleteRepository { + func delete(_ favorite: Favorite) throws +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBDeleteRepository.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBDeleteRepository.swift new file mode 100644 index 00000000..1b97ea01 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBDeleteRepository.swift @@ -0,0 +1,31 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation +import SotoDynamoDB + +final class DynamoDBDeleteRepository: DeleteRepository { + private let dynamoDB: DynamoDB + + init(awsClient: AWSClient) { + self.dynamoDB = DynamoDB(client: awsClient) + } + + func delete(_ favorite: Favorite) throws { + guard let favoriteTableName = Environment.databaseTableName else { + throw BackendError.databaseTableNotFound + } + + let favoriteKey: [String : DynamoDB.AttributeValue] = [ + "recordID" : .s(favorite.recordID) + ] + + + let dynamoInputItem = DynamoDB.DeleteItemInput(key: favoriteKey, tableName: favoriteTableName) + let output = try dynamoDB.deleteItem(dynamoInputItem).wait() + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBInsertRepository.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBInsertRepository.swift new file mode 100644 index 00000000..c69c63dd --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/DynamoDBInsertRepository.swift @@ -0,0 +1,26 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation +import SotoDynamoDB + +final class DynamoDBInsertRepository: InsertRepository { + private let dynamoDB: DynamoDB + + init(awsClient: AWSClient) { + self.dynamoDB = DynamoDB(client: awsClient) + } + + func insert(_ favorite: Favorite) throws { + guard let favoriteTableName = Environment.databaseTableName else { + throw BackendError.databaseTableNotFound + } + + let dynamoInputItem = DynamoDB.PutItemCodableInput(item: favorite, tableName: favoriteTableName) + let output = try dynamoDB.putItem(dynamoInputItem).wait() + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/InsertRepository.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/InsertRepository.swift new file mode 100644 index 00000000..a1c20ba4 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Data/Repositories/InsertRepository.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +protocol InsertRepository { + func insert(_ favorite: Favorite) throws +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/FavoritesController.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/FavoritesController.swift new file mode 100644 index 00000000..8f0be325 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/FavoritesController.swift @@ -0,0 +1,49 @@ +import Foundation +import AWSLambdaRuntime +import AWSLambdaEvents + +@main +struct FavoritesController: SimpleLambdaHandler { + func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response { + guard let body = event.body else { + context.logger.error("🚨 No body at request") + throw BackendError.emptyParameter + } + + let jsonDecoder = JSONDecoder() + + guard let requestData = body.data(using: .utf8), + let favorite = try? jsonDecoder.decode(Favorite.self, from: requestData) + else + { + let message = "🚨 body data is not in the expected format" + + context.logger.error("\(message)") + return APIGatewayV2Response(statusCode: .badRequest, body: message) + } + + var command: FavoriteCommand? + + switch event.context.http.method { + case .POST: + command = FavoritePOSTCommand(parameter: favorite, + repository: DependencyManager.makeInsertRepository()) + + context.logger.info("POST \(favorite)") + case .DELETE: + command = FavoriteDELETECommand(parameter: favorite, + repository: DependencyManager.makeDeleteRepository()) + + context.logger.info("DELETE \(favorite)") + default: + context.logger.error("🚨 Unexpected HTTP method") + return APIGatewayV2Response(statusCode: .methodNotAllowed) + } + + try command?.execute() + + let apiResponse = APIGatewayV2Response(statusCode: .ok, body: "OK 😜") + + return apiResponse + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/DependencyManager.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/DependencyManager.swift new file mode 100644 index 00000000..c21139f5 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/DependencyManager.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation +import SotoDynamoDB + +final class DependencyManager { + private static var awsClient: AWSClient { + AWSClient(credentialProvider: .environment, + httpClientProvider: .createNew) + } + + static func makeDeleteRepository() -> DeleteRepository { + return DynamoDBDeleteRepository(awsClient: self.awsClient) + } + + static func makeInsertRepository() -> InsertRepository { + return DynamoDBInsertRepository(awsClient: self.awsClient) + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/Environment.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/Environment.swift new file mode 100644 index 00000000..bb63d696 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Infrastructure/Environment.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +enum Environment { + static let databaseTableName = ProcessInfo.processInfo.environment["DB_TABLE_NAME"] +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/BackendError.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/BackendError.swift new file mode 100644 index 00000000..bd5bccb0 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/BackendError.swift @@ -0,0 +1,15 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +enum BackendError: Error { + case emptyParameter + case unexpectedParameter + case httpMethodNotImplemented + case databaseTableNotFound +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/Favorite.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/Favorite.swift new file mode 100644 index 00000000..f058fae2 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Sources/Favorites/Model/Favorite.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 13/3/23. +// + +import Foundation + +struct Favorite: Codable { + let recordID: String + let userID: String + let showID: Int + + init(user: String, show: Int) { + self.userID = user + self.showID = show + self.recordID = "\(user)-\(show.description)" + } + +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Tests/FavoritesTests/FavoritesTests.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Tests/FavoritesTests/FavoritesTests.swift new file mode 100644 index 00000000..b5e945bf --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBackend/Tests/FavoritesTests/FavoritesTests.swift @@ -0,0 +1,11 @@ +import XCTest +@testable import Favorites + +final class AWSLambdaBackendTests: XCTestCase { + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(true, true) + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Package.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Package.swift new file mode 100644 index 00000000..525848cf --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Package.swift @@ -0,0 +1,26 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "AWSLambdaBasic", + platforms: [ + .macOS(.v12) + ], + dependencies: [ + .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .executableTarget( + name: "AWSLambdaBasic", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime") + ]), + .testTarget( + name: "AWSLambdaBasicTests", + dependencies: ["AWSLambdaBasic"]), + ] +) diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/README.md b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/README.md new file mode 100644 index 00000000..43e903cd --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/README.md @@ -0,0 +1,18 @@ +# AWSLambdaBasic + +This package shows the basic usage of a Lambda using Swift. + +## Creating the package + +## Requesites + +## Testing + +LOCAL_LAMBDA_SERVER_ENABLED=true + +## Generating + +```bash +swift package --disable-sandbox archive --output-path /Users/JohnAppleseed/Desktop --verbose 2 +``` + diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/AWSLambdaBasic.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/AWSLambdaBasic.swift new file mode 100644 index 00000000..637da3b3 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/AWSLambdaBasic.swift @@ -0,0 +1,12 @@ +import Foundation +import AWSLambdaRuntime + +@main +final class AWSLambdaBasic: SimpleLambdaHandler { + + func handle(_ request: BasicRequest, context: LambdaContext) async throws -> BasicResponse { + let response = BasicResponse(name: request.name) + + return response + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicRequest.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicRequest.swift new file mode 100644 index 00000000..06c45c67 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicRequest.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 12/3/23. +// + +import Foundation + +struct BasicRequest: Codable { + let name: String +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicResponse.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicResponse.swift new file mode 100644 index 00000000..31c02643 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Sources/AWSLambdaBasic/Model/BasicResponse.swift @@ -0,0 +1,17 @@ +// +// File.swift +// +// +// Created by Adolfo Vera Blasco on 12/3/23. +// + +import Foundation + +struct BasicResponse: Codable { + let salute: String + + init(name: String) { + let developmentLanguage = ProcessInfo.processInfo.environment["DEV_LANG"] + self.salute = "¡Hola \(name)! 👋. Estoy programada en \(developmentLanguage ?? "🤷‍♂️")" + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Tests/AWSLambdaBasicTests/AWSLambdaBasicTests.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Tests/AWSLambdaBasicTests/AWSLambdaBasicTests.swift new file mode 100644 index 00000000..bfb20966 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaBasic/Tests/AWSLambdaBasicTests/AWSLambdaBasicTests.swift @@ -0,0 +1,12 @@ +import XCTest +@testable import AWSLambdaBasic + +final class AWSLambdaBasicTests: XCTestCase { + func testResponse() throws { + let myName = "Adolfo" + let response = BasicResponse(name: myName) + + XCTAssertEqual(response.salute, "¡Hola \(myName)! 👋") + + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Package.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Package.swift new file mode 100644 index 00000000..de190577 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "AWSLambdaTracking", + platforms: [ + .macOS(.v12) + ], + dependencies: [ + .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha"), + .package(url: "https://github.com/swift-server/swift-aws-lambda-events.git", branch: "main") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .executableTarget( + name: "AWSLambdaTracking", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime"), + .product(name: "AWSLambdaEvents", package: "swift-aws-lambda-events") + ]), + .testTarget( + name: "AWSLambdaTrackingTests", + dependencies: ["AWSLambdaTracking"]), + ] +) diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/README.md b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/README.md new file mode 100644 index 00000000..33231d88 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/README.md @@ -0,0 +1,5 @@ +# AWSLambdaTracking + +A description of this package. + +https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/AWSLambdaTracking.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/AWSLambdaTracking.swift new file mode 100644 index 00000000..47f540d8 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/AWSLambdaTracking.swift @@ -0,0 +1,30 @@ +import Foundation + +import AWSLambdaRuntime +import AWSLambdaEvents + +@main +struct AWSLambdaTracking: LambdaHandler { + init(context: LambdaInitializationContext) async throws { + // Inicialializamos... + } + + func handle(_ event: SQSEvent, context: LambdaContext) async throws { + let userStatistics = event.records.compactMap({ event -> UserStatistic? in + let jsonDecoder = JSONDecoder() + + guard let data = event.body.data(using: .utf8), + let userStatistics = try? jsonDecoder.decode(UserStatistic.self, from: data) + else + { + return nil + } + + return userStatistics + }) + + for userStatistic in userStatistics { + context.logger.info("😎 \(userStatistic.userId): \(userStatistic.activity) el medio \(userStatistic.mediaId.description)" ) + } + } +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/LambdaTrackingError.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/LambdaTrackingError.swift new file mode 100644 index 00000000..e06c98fd --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/LambdaTrackingError.swift @@ -0,0 +1,5 @@ +import Foundation + +enum LambdaTrackingError: Error { + case malformedRequestParameter +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/UserStatistic.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/UserStatistic.swift new file mode 100644 index 00000000..586046a1 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Sources/AWSLambdaTracking/Models/UserStatistic.swift @@ -0,0 +1,8 @@ +import Foundation + +struct UserStatistic: Decodable { + let createdAt: Date + let activity: String + let mediaId: Int + let userId: String +} diff --git a/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Tests/AWSLambdaTrackingTests/AWSLambdaTrackingTests.swift b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Tests/AWSLambdaTrackingTests/AWSLambdaTrackingTests.swift new file mode 100644 index 00000000..84d45deb --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/AWSLambdaTracking/Tests/AWSLambdaTrackingTests/AWSLambdaTrackingTests.swift @@ -0,0 +1,8 @@ +import XCTest +@testable import AWSLambdaTracking + +final class AWSLambdaTrackingTests: XCTestCase { + func testExample() throws { + XCTAssertTrue(true) + } +} diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Package.swift b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Package.swift new file mode 100644 index 00000000..b46264c7 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Package.swift @@ -0,0 +1,38 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "LambdaMultipleFunctions", + platforms: [ + .macOS(.v12) + ], + dependencies: [ + .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0-alpha") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .executableTarget( + name: "Lambda1", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime") + ]), + .executableTarget( + name: "Lambda2", + dependencies: [ + .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime") + ]), + .testTarget( + name: "Lambda1Tests", + dependencies: ["Lambda1"], + path: "Tests/Lambda1Tests" + ), + .testTarget( + name: "Lambda2Tests", + dependencies: ["Lambda2"], + path: "Tests/Lambda2Tests" + ) + ] +) diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/README.md b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/README.md new file mode 100644 index 00000000..77f32070 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/README.md @@ -0,0 +1,3 @@ +# LambdaMultipleFunctions + +A description of this package. diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda1/LambdaFunction1.swift b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda1/LambdaFunction1.swift new file mode 100644 index 00000000..14d536f5 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda1/LambdaFunction1.swift @@ -0,0 +1,10 @@ +import Foundation +import AWSLambdaRuntime +import AWSLambdaRuntimeCore + +@main +struct LambdaFunction1: SimpleLambdaHandler { + func handle(_ request: String, context: LambdaContext) async throws -> String { + return "Test function 1" + } +} diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda2/LambdaFunction2.swift b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda2/LambdaFunction2.swift new file mode 100644 index 00000000..673bb617 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Sources/Lambda2/LambdaFunction2.swift @@ -0,0 +1,10 @@ +import Foundation +import AWSLambdaRuntime +import AWSLambdaRuntimeCore + +@main +struct LambdaFunction2: SimpleLambdaHandler { + func handle(_ request: String, context: LambdaContext) async throws -> String { + return "Test function 2" + } +} diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda1Tests/Lambda1Tests.swift b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda1Tests/Lambda1Tests.swift new file mode 100644 index 00000000..864ec759 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda1Tests/Lambda1Tests.swift @@ -0,0 +1,12 @@ +import XCTest +@testable import Lambda2 +@testable import Lambda1 + +final class Lambda1Tests: XCTestCase { + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(true, true) + } +} diff --git a/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda2Tests/Lambda2Tests.swift b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda2Tests/Lambda2Tests.swift new file mode 100644 index 00000000..d12f52d1 --- /dev/null +++ b/Examples/GlobantPlus/Lambdas/LambdaMultipleFunctions/Tests/Lambda2Tests/Lambda2Tests.swift @@ -0,0 +1,35 @@ +// +// Lambda2Tests.swift +// +// +// Created by Adolfo Vera Blasco on 18/2/23. +// + +import XCTest + +final class Lambda2Tests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Examples/GlobantPlus/README-EN.md b/Examples/GlobantPlus/README-EN.md new file mode 100644 index 00000000..9d8908db --- /dev/null +++ b/Examples/GlobantPlus/README-EN.md @@ -0,0 +1,56 @@ +# Tech Talk: AWS Lambda with Swift + +This is the repository with all the code shown in the Tech Talk by [Globant](https://www.globant.com/) where we talked about using the Swift language to develop Amazon Web Services Lambdas. + +## Organization + +Inside this repository you will find the following projects + +* **App** folder + * **GlobantPlus**. It is the tvOS application developed as a guide in the talk. It calls the Lambdas that store the user's favorites and tracking while using the application. +* Lambdas folder + * **AWSLambdaBasic** The most basic Lambda. + * **AWSLambdaBackend** Handles `POST` and `DELETE` events received by AWS API Gateway and inserts them into a DynamoDB database. + * **AWSLambdaTracking** Receives an event from an AWS SQS message queue. + * **AWSMultipleFunctions** Multiple Lambdas inside the same Swift Package. + + +## Preparing the GlobantPlus app + +To be able to compile and run the GlobantPlus application, a project configuration file (`.xcconfig`) is required which will contain the user account data for The Movie Database and the identity keys created for our Amazon Web Services user. + +```xcconfig +TMDB_API_KEY = [API Key para Movie Database ] +TMDB_API_AUTH_KEY = [Tu AUTH KEY de The Movie Database] + +AWS_ACCESS_KEY_ID = [Tu clave de acceso de AWS] +AWS_SECRET_ACCESS_KEY = [Clave secreta de acceso a AWS] + +AWS_SQS_QUEUE_URL = [URL de la cola de mensajes SQS] +AWS_API_GATEWAY_URL = [URL base de AWS API Gateway] +``` + +After adding the file, you must set it to be used by the Debug and Release environments. + +![Xcode-xcconfig](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/XCConfig-Xcode.png) + +### The Movie Database + +You need to have a user on [themoviedb.org](https://www.themoviedb.org/). + +To get your API credentials, go to User > Settings > API and copy the values from the **API Key (v3 auth)** and **Read Access Token for the API (v4 auth)** sections. + +![TMDB](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/tmdb.png) + +## AWS Access Keys + +Click on your user avatar and then on Security Credentials. Once there, go to the **Access keys** section and create the keys. + +## Documentation + +In the **Documentation** folder inside this repository, you will find details about some aspects discussed during the talk. + +## Contact + +* **GitHub**: [fitomad](https://github.com/fitomad) +* **LinkedIn**: [www.linkedin.com/in/adolfo-vera](www.linkedin.com/in/adolfo-vera) \ No newline at end of file diff --git a/Examples/GlobantPlus/README.MD b/Examples/GlobantPlus/README.MD new file mode 100644 index 00000000..fbf1e757 --- /dev/null +++ b/Examples/GlobantPlus/README.MD @@ -0,0 +1,56 @@ +# Tech Talk: AWS Lambda con Swift + +Este es el repositorio con todo el código mostrado en la Tech Talk de [Globant](https://www.globant.com/) en que hablamos sobre el uso del lenguaje Swift para desarrollar Amazon Web Services Lambdas. + +## Organización + +Dentro de este repositorio encontrarás los siguientes proyectos + +* Carpeta **App** + * **GlobantPlus**. Es la aplicación desarrollada para tvOS que sirve de guía en la charla. Hace las llamadas a las Lambdas que almacenan los favoritos y el tracking del usuario mientras usa la aplicación +* Carpeta **Lambdas** + * **AWSLambdaBasic** La Lambda más básica. + * **AWSLambdaBackend** Se encanrga de los eventos `POST` y `DELETE` recibidos por AWS API Gateway y los inserta en una base de datos DynamoDB + * **AWSLambdaTracking** Recibe un evento de una cola de mensaje AWS SQS. + * **AWSMultipleFunctions** Varias Lambdas dentro de un mismo Swift Package. + +## Preparar la app GlobantPlus + +Para poder compilar y ejecutar la aplicación GlobantPlus es necesario un archivo de configuración de proyecto (`.xcconfig`) que contendrá los datos de cuentas de usuario para The Movie Database y las claves de identidad creadas para nuestro usuario de Amazon Web Services + +```xcconfig +TMDB_API_KEY = [API Key para Movie Database ] +TMDB_API_AUTH_KEY = [Tu AUTH KEY de The Movie Database] + +AWS_ACCESS_KEY_ID = [Tu clave de acceso de AWS] +AWS_SECRET_ACCESS_KEY = [Clave secreta de acceso a AWS] + +AWS_SQS_QUEUE_URL = [URL de la cola de mensajes SQS] +AWS_API_GATEWAY_URL = [URL base de AWS API Gateway] +``` + +Tras añadir el archivo debe establecer que los entornos de **Debug** y **Release** lo usen + +![Xcode-xcconfig](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/XCConfig-Xcode.png) + +### The Movie Database + +Necesitas tener un usuario en [themoviedb.org](https://www.themoviedb.org/). + +Para conseguir tus credenciales de API debes dirigirte a Usuario > Configuración > API y copiar +los valores de las sección **Clave de la API (v3 auth)** y **Token de acceso de lectura a la API (v4 auth)** + +![TMDB](https://github.com/fitomad/TechTalk-AWS-Lamba-Swift/raw/main/Documentation/Images/tmdb.png) + +# Access Keys de AWS + +Debes pulsar sobre tu avatar de usuario y luego Credenciales de seguridad. Una vez allí dirígite a la sección **Claves de acceso** y crea las claves. + +## Documentación + +En la carpeta **Documentación** dentro de este repositorio encontraréis detalles sobre algunos aspectos comentados durante la charla. + +## Contacto + +* **GitHub**: [fitomad](https://github.com/fitomad) +* **LinkedIn**: [www.linkedin.com/in/adolfo-vera](www.linkedin.com/in/adolfo-vera)